@@ -53,9 +53,10 @@ import Data.Enumerator.IO (iterHandle, enumHandle)
5353import Blaze.ByteString.Builder.Enumerator (builderToByteString)
5454import Blaze.ByteString.Builder.HTTP
5555 (chunkedTransferEncoding, chunkedTransferTerminator)
56−import Blaze.ByteString.Builder (fromByteString, Builder, toLazyByteString)
56+import Blaze.ByteString.Builder
57+ (fromByteString, Builder, toLazyByteString, toByteStringIO)
5758import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
58−import Data.Monoid (mconcat)
59+import Data.Monoid (mconcat, mappend)
5960import Network.Socket.SendFile (sendFile)
6061
6162import Control.Monad.IO.Class (liftIO)
@@ -232,6 +233,19 @@ sendResponse req hv socket (ResponseFile s hs fp) = do
232233 sendFile socket fp
233234 return $ lookup "content-length" hs /= Nothing
234235 else return True
236+sendResponse req hv socket (ResponseBuilder s hs b) = do
237+ toByteStringIO (Sock.sendAll socket) b'
238+ return isKeepAlive
239+ where
240+ b' =
241+ if isChunked'
242+ then headers hv s hs True
243+ `mappend` chunkedTransferEncoding b
244+ `mappend` chunkedTransferTerminator
245+ else headers hv s hs False `mappend` b
246+ hasLength = lookup "content-length" hs /= Nothing
247+ isChunked' = isChunked hv && not hasLength
248+ isKeepAlive = isChunked' || hasLength
235249sendResponse req hv socket (ResponseEnumerator res) =
236250 res go
237251 where