on master help sign in
Optimized sendResponse for ResponseBuilder
ab5b540Michael Snoyman
Network/Wai/Handler/Warp.hs+13−9
@@ -218,19 +218,23 @@ sendResponse req hv socket (ResponseFile s hs fp) = do
218 sendFile socket fp
218 sendFile socket fp
219 return $ lookup "content-length" hs /= Nothing
219 return $ lookup "content-length" hs /= Nothing
220 else return True
220 else return True
221−sendResponse req hv socket (ResponseBuilder s hs b) = do
221+sendResponse req hv socket (ResponseBuilder s hs b)
222+ | hasBody s req = do
222− toByteStringIO (Sock.sendAll socket) $
223+ toByteStringIO (Sock.sendAll socket) b'
223− if hasBody s req
224+ return isKeepAlive
224− then b'
225+ | otherwise = do
226+ Sock.sendMany socket
227+ $ L.toChunks
228+ $ toLazyByteString
225− else headers'
229+ $ headers hv s hs False
226− return isKeepAlive
230+ return True
227 where
231 where
228− headers' = headers hv s hs True
232+ headers' = headers hv s hs isChunked'
229 b' =
233 b' =
230 if isChunked'
234 if isChunked'
231 then headers'
235 then headers'
232− `mappend` chunkedTransferEncoding b
236+ `mappend` chunkedTransferEncoding b
233− `mappend` chunkedTransferTerminator
237+ `mappend` chunkedTransferTerminator
234 else headers hv s hs False `mappend` b
238 else headers hv s hs False `mappend` b
235 hasLength = lookup "content-length" hs /= Nothing
239 hasLength = lookup "content-length" hs /= Nothing
236 isChunked' = isChunked hv && not hasLength
240 isChunked' = isChunked hv && not hasLength