on master help sign in
Fix content-length keepalives
b1da211Michael Snoyman
Network/Wai/Handler/Warp.hs+2−10
@@ -201,9 +201,7 @@ sendResponse :: HttpVersion -> Handle -> Response -> IO Bool
201sendResponse hv handle (ResponseFile s hs fp) = do
201sendResponse hv handle (ResponseFile s hs fp) = do
202 mapM_ (S.hPut handle) $ L.toChunks $ toLazyByteString $ headers hv s hs False
202 mapM_ (S.hPut handle) $ L.toChunks $ toLazyByteString $ headers hv s hs False
203 unsafeSendFile handle fp
203 unsafeSendFile handle fp
204− if lookup "content-length" hs == Nothing
204+ return $ lookup "content-length" hs /= Nothing
205− then return False
206− else S.hPut handle "\r\n\r\n" >> return True
207sendResponse hv handle (ResponseEnumerator res) =
205sendResponse hv handle (ResponseEnumerator res) =
208 res go
206 res go
209 where
207 where
@@ -219,10 +217,7 @@ sendResponse hv handle (ResponseEnumerator res) =
219 chunk' i =
217 chunk' i =
220 if isChunked'
218 if isChunked'
221 then E.joinI $ chunk $$ i
219 then E.joinI $ chunk $$ i
222− else
220+ else i
223− (if isKeepAlive
224− then E.joinI $ after $$ i
225− else i)
226 chunk :: E.Enumeratee Builder Builder IO Bool
221 chunk :: E.Enumeratee Builder Builder IO Bool
227 chunk = E.checkDone $ E.continue . step
222 chunk = E.checkDone $ E.continue . step
228 step k E.EOF = k (E.Chunks [chunkedTransferTerminator]) >>== return
223 step k E.EOF = k (E.Chunks [chunkedTransferTerminator]) >>== return
@@ -231,9 +226,6 @@ sendResponse hv handle (ResponseEnumerator res) =
231 k (E.Chunks [chunked]) >>== chunk
226 k (E.Chunks [chunked]) >>== chunk
232 where
227 where
233 chunked = chunkedTransferEncoding $ mconcat builders
228 chunked = chunkedTransferEncoding $ mconcat builders
234− after = E.checkDone $ E.continue . after'
235− after' k E.EOF = k (E.Chunks [fromByteString "\r\n\r\n"]) >>== return
236− after' k chunks = k chunks >>== after
237
229
238parseHeaderNoAttr :: ByteString -> (ByteString, ByteString)
230parseHeaderNoAttr :: ByteString -> (ByteString, ByteString)
239parseHeaderNoAttr s =
231parseHeaderNoAttr s =
warp.cabal+1−1
@@ -26,7 +26,7 @@ Library
26
26
27Executable warp
27Executable warp
28 Main-is: warp.hs
28 Main-is: warp.hs
29− ghc-options: -Wall -O2
29+ ghc-options: -Wall -O2 -threaded
30 Build-Depends: text >= 0.8 && < 0.12
30 Build-Depends: text >= 0.8 && < 0.12
31 , directory >= 1.0 && < 1.2
31 , directory >= 1.0 && < 1.2
32
32
warp.hs+1
@@ -29,6 +29,7 @@ app prefix Request { requestMethod = m, pathInfo = p }
29 let ext = reverse $ takeWhile (/= '.') $ reverse file
29 let ext = reverse $ takeWhile (/= '.') $ reverse file
30 let ct = getCT ext
30 let ct = getCT ext
31 e <- doesFileExist file
31 e <- doesFileExist file
32+ -- FIXME check file size
32 if e
33 if e
33 then return $ ResponseFile status200 [("Content-Type", ct)] file
34 then return $ ResponseFile status200 [("Content-Type", ct)] file
34 else return $ responseLBS status404 [("Content-Type", "text/plain")] "File not found"
35 else return $ responseLBS status404 [("Content-Type", "text/plain")] "File not found"