on master help sign in
Unroll static mconcats
66180a8Michael Snoyman
Network/Wai/Handler/Warp.hs+20−23
@@ -195,26 +195,25 @@ parseFirst s = do
195 return (method, rpath, qstring, hsecond)
195 return (method, rpath, qstring, hsecond)
196
196
197headers :: HttpVersion -> Status -> ResponseHeaders -> Bool -> Builder
197headers :: HttpVersion -> Status -> ResponseHeaders -> Bool -> Builder
198−headers httpversion status responseHeaders isChunked' = mconcat
198+headers httpversion status responseHeaders isChunked' =
199− [ copyByteString "HTTP/"
199+ copyByteString "HTTP/"
200− , copyByteString httpversion
200+ `mappend` copyByteString httpversion
201− , fromChar ' '
201+ `mappend` fromChar ' '
202− , fromString $ show $ statusCode status
202+ `mappend` fromString $ show $ statusCode status
203− , fromChar ' '
203+ `mappend` fromChar ' '
204− , copyByteString $ statusMessage status
204+ `mappend` copyByteString $ statusMessage status
205− , copyByteString "\r\n"
205+ `mappend` copyByteString "\r\n"
206− , mconcat $ map go responseHeaders
206+ `mappend` mconcat (map go responseHeaders)
207+ `mappend`
207− , if isChunked'
208+ if isChunked'
208− then copyByteString "Transfer-Encoding: chunked\r\n\r\n"
209+ then copyByteString "Transfer-Encoding: chunked\r\n\r\n"
209− else copyByteString "\r\n"
210+ else copyByteString "\r\n"
210− ]
211 where
211 where
212− go (x, y) = mconcat
212+ go (x, y) =
213− [ copyByteString $ ciOriginal x
213+ copyByteString $ ciOriginal x
214− , copyByteString ": "
214+ `mappend` copyByteString ": "
215− , copyByteString y
215+ `mappend` copyByteString y
216− , copyByteString "\r\n"
216+ `mappend` copyByteString "\r\n"
217− ]
218
217
219isChunked :: HttpVersion -> Bool
218isChunked :: HttpVersion -> Bool
220isChunked = (==) http11
219isChunked = (==) http11
@@ -273,10 +272,8 @@ sendResponse req hv socket (ResponseEnumerator res) =
273 chunk = E.checkDone $ E.continue . step
272 chunk = E.checkDone $ E.continue . step
274 step k E.EOF = k (E.Chunks [chunkedTransferTerminator]) >>== return
273 step k E.EOF = k (E.Chunks [chunkedTransferTerminator]) >>== return
275 step k (E.Chunks []) = E.continue $ step k
274 step k (E.Chunks []) = E.continue $ step k
276− step k (E.Chunks builders) =
275+ -- FIXME ensure that the mconcat on the concents here is unnecessary
277− k (E.Chunks [chunked]) >>== chunk
276+ step k x = k x >>== chunk
278− where
279− chunked = chunkedTransferEncoding $ mconcat builders
280
277
281parseHeaderNoAttr :: ByteString -> (ByteString, ByteString)
278parseHeaderNoAttr :: ByteString -> (ByteString, ByteString)
282parseHeaderNoAttr s =
279parseHeaderNoAttr s =