@@ -37,8 +37,6 @@ import Network.Socket
38import qualified Network.Socket.ByteString as Sock
38import qualified Network.Socket.ByteString as Sock
39import Control.Exception (bracket, finally, Exception, SomeException, catch)
39import Control.Exception (bracket, finally, Exception, SomeException, catch)
40−import System.IO (Handle, hClose, hFlush)
41−import System.IO.Error (isEOFError, ioeGetHandle)
42import Control.Concurrent (forkIO)
40import Control.Concurrent (forkIO)
43import Control.Monad (unless, when)
41import Control.Monad (unless, when)
44import Data.Maybe (fromMaybe)
42import Data.Maybe (fromMaybe)
@@ -49,7 +47,6 @@ import Control.Arrow (first)
50import Data.Enumerator (($$), (>>==))
48import Data.Enumerator (($$), (>>==))
51import qualified Data.Enumerator as E
49import qualified Data.Enumerator as E
52−import Data.Enumerator.IO (iterHandle, enumHandle)
53import Blaze.ByteString.Builder.Enumerator (builderToByteString)
50import Blaze.ByteString.Builder.Enumerator (builderToByteString)
54import Blaze.ByteString.Builder.HTTP
51import Blaze.ByteString.Builder.HTTP
55 (chunkedTransferEncoding, chunkedTransferTerminator)
52 (chunkedTransferEncoding, chunkedTransferTerminator)
@@ -234,12 +231,16 @@ sendResponse req hv socket (ResponseFile s hs fp) = do
234 return $ lookup "content-length" hs /= Nothing
231 return $ lookup "content-length" hs /= Nothing
235 else return True
232 else return True
236sendResponse req hv socket (ResponseBuilder s hs b) = do
233sendResponse req hv socket (ResponseBuilder s hs b) = do
237− toByteStringIO (Sock.sendAll socket) b'
234+ toByteStringIO (Sock.sendAll socket) $
238 return isKeepAlive
238 return isKeepAlive
240+ headers' = headers hv s hs True
241 if isChunked'
242 if isChunked'
242− then headers hv s hs True
243+ then headers'
243 `mappend` chunkedTransferEncoding b
244 `mappend` chunkedTransferEncoding b
244 `mappend` chunkedTransferTerminator
245 `mappend` chunkedTransferTerminator
245 else headers hv s hs False `mappend` b
246 else headers hv s hs False `mappend` b
@@ -310,7 +311,7 @@ requestBodyHandle initLen =
310 case mbs of
311 case mbs of
311 Nothing -> return ()
312 Nothing -> return ()
312 Just bs -> do
313 Just bs -> do
313− (bs', newlen) <- yieldExtra len bs
314+ (_, newlen) <- yieldExtra len bs
314 drain newlen
315 drain newlen
315 yieldExtra len bs
316 yieldExtra len bs
316 | B.length bs == len = return (bs, 0)
317 | B.length bs == len = return (bs, 0)
@@ -320,12 +321,14 @@ requestBodyHandle initLen =
320 E.yield () $ E.Chunks [y]
321 E.yield () $ E.Chunks [y]
321 return (x, 0)
322 return (x, 0)
324+iterSocket :: Socket -> E.Iteratee ByteString IO ()
323iterSocket socket =
325iterSocket socket =
324 E.continue go
326 E.continue go
326 go E.EOF = E.yield () E.EOF
328 go E.EOF = E.yield () E.EOF
327 go (E.Chunks cs) = liftIO (Sock.sendMany socket cs) >> E.continue go
329 go (E.Chunks cs) = liftIO (Sock.sendMany socket cs) >> E.continue go
331+enumSocket :: Int -> Socket -> E.Enumerator ByteString IO a
329enumSocket len socket (E.Continue k) = do
332enumSocket len socket (E.Continue k) = do
330#if NO_TIMEOUT_PROTECTION
333#if NO_TIMEOUT_PROTECTION
331 bs <- liftIO $ Sock.recv socket len
334 bs <- liftIO $ Sock.recv socket len