fix hang at end of PUT to proxied p2p http remote
sendExactly will now be sure to evaluate the whole lazy ByteString. In this case, the lazy ByteString was exactly the right lenth. But, it seems that L.take caused it to not actually be fully evaluated. In servePut, this manifested as gather never being fully evaluated, which caused the hang. Very, very subtle, and horrible bug. Clearly the use of lazy ByteString (or really just laziness) is at fault, and it would be very worth moving to conduit or whatever to avoid this.
This commit is contained in:
parent
b431201e1f
commit
a3dab58be2
3 changed files with 19 additions and 6 deletions
|
@ -335,12 +335,16 @@ debugMessage conn prefix m = do
|
|||
-- Must avoid sending too many bytes as it would confuse the other end.
|
||||
-- This is easily dealt with by truncating it.
|
||||
--
|
||||
-- However, the whole ByteString will be evaluated here, even if
|
||||
-- the end of it does not get sent.
|
||||
--
|
||||
-- If too few bytes are sent, the only option is to give up on this
|
||||
-- connection. False is returned to indicate this problem.
|
||||
sendExactly :: Len -> L.ByteString -> Handle -> MeterUpdate -> IO Bool
|
||||
sendExactly (Len n) b h p = do
|
||||
sent <- meteredWrite' p (B.hPut h) (L.take (fromIntegral n) b)
|
||||
return (fromBytesProcessed sent == n)
|
||||
let (x, y) = L.splitAt (fromIntegral n) b
|
||||
sent <- meteredWrite' p (B.hPut h) x
|
||||
L.length y `seq` return (fromBytesProcessed sent == n)
|
||||
|
||||
receiveExactly :: Len -> Handle -> MeterUpdate -> IO L.ByteString
|
||||
receiveExactly (Len n) h p = hGetMetered h (Just n) p
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue