@@ -51,18 +51,18 @@ sendResponse cleaner req conn (ResponseFile s hs path mpart) =
5151
5252 sendResponse' (Right (lengthyHeaders, cl))
5353 | hasBody s req = liftIO $ do
54+ lheader <- composeHeader version s lengthyHeaders
5455 connSendFile conn path beg end (T.tickle th) [lheader] cleaner
5556 T.tickle th
5657 return isPersist
5758 | otherwise = liftIO $ do
58− connSendAll conn $ composeHeader version s hs
59+ composeHeader version s hs >>= connSendAll conn
5960 T.tickle th
6061 return isPersist -- FIXME isKeepAlive?
6162 where
6263 (beg,end) = case mpart of
6364 Nothing -> (0,cl)
6465 Just prt -> (filePartOffset prt, filePartByteCount prt)
65− lheader = composeHeader version s lengthyHeaders
6666 version = httpVersion req
6767 (isPersist,_) = infoFromRequest req
6868
@@ -75,21 +75,21 @@ sendResponse cleaner req conn (ResponseFile s hs path mpart) =
7575
7676sendResponse cleaner req conn (ResponseBuilder s hs b)
7777 | hasBody s req = liftIO $ do
78+ header <- composeHeaderBuilder version s hs needsChunked
79+ let body
80+ | needsChunked = header `mappend` chunkedTransferEncoding b
81+ `mappend` chunkedTransferTerminator
82+ | otherwise = header `mappend` b
7883 flip toByteStringIO body $ \bs -> do
7984 connSendAll conn bs
8085 T.tickle th
8186 return isKeepAlive
8287 | otherwise = liftIO $ do
83− connSendAll conn $ composeHeader version s hs
88+ composeHeader version s hs >>= connSendAll conn
8489 T.tickle th
8590 return isPersist
8691 where
8792 th = threadHandle cleaner
88− header = composeHeaderBuilder version s hs needsChunked
89− body
90− | needsChunked = header `mappend` chunkedTransferEncoding b
91− `mappend` chunkedTransferTerminator
92− | otherwise = header `mappend` b
9393 version = httpVersion req
9494 reqinfo@(isPersist,_) = infoFromRequest req
9595 (isKeepAlive, needsChunked) = infoFromResponse hs reqinfo
@@ -98,16 +98,16 @@ sendResponse cleaner req conn (ResponseBuilder s hs b)
9898
9999sendResponse cleaner req conn (ResponseSource s hs bodyFlush)
100100 | hasBody s req = do
101+ header <- liftIO $ composeHeaderBuilder version s hs needsChunked
101102 let src = CL.sourceList [header] `mappend` cbody
102103 src $$ builderToByteString =$ connSink conn th
103104 return isKeepAlive
104105 | otherwise = liftIO $ do
105− connSendAll conn $ composeHeader version s hs
106+ composeHeader version s hs >>= connSendAll conn
106107 T.tickle th
107108 return isPersist
108109 where
109110 th = threadHandle cleaner
110− header = composeHeaderBuilder version s hs needsChunked
111111 body = mapOutput (\x -> case x of
112112 Flush -> flush
113113 Chunk builder -> builder) bodyFlush
@@ -205,11 +205,11 @@ warpVersionHeader = (hServer, ver)
205205
206206----------------------------------------------------------------
207207
208−composeHeader :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> ByteString
208+composeHeader :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> IO ByteString
209209composeHeader version s hs = RH.composeHeader version s (addServerHeader hs)
210210
211−composeHeaderBuilder :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> Bool -> Builder
211+composeHeaderBuilder :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> Bool -> IO Builder
212212composeHeaderBuilder ver s hs True =
213− fromByteString $ composeHeader ver s (addEncodingHeader hs)
213+ fromByteString <$> composeHeader ver s (addEncodingHeader hs)
214214composeHeaderBuilder ver s hs False =
215− fromByteString $ composeHeader ver s hs
215+ fromByteString <$> composeHeader ver s hs