@@ -83,7 +83,7 @@ serveConnection port app conn remoteHost' = do
83 res <- app env
83 res <- app env
84 remaining <- readIORef ilen
84 remaining <- readIORef ilen
85 _ <- B.hGet conn remaining -- FIXME just skip, don't read
85 _ <- B.hGet conn remaining -- FIXME just skip, don't read
86− keepAlive <- sendResponse (httpVersion env) conn res
86+ keepAlive <- sendResponse env (httpVersion env) conn res
87 hFlush conn
87 hFlush conn
88 when keepAlive serveConnection'
88 when keepAlive serveConnection'
@@ -197,14 +197,26 @@ headers httpversion status responseHeaders isChunked' = mconcat
197isChunked :: HttpVersion -> Bool
197isChunked :: HttpVersion -> Bool
198isChunked = (==) http11
198isChunked = (==) http11
200+hasBody :: Status -> Request -> Bool
201+hasBody s req = s /= (Status 204 "") && requestMethod req /= "HEAD"
200−sendResponse :: HttpVersion -> Handle -> Response -> IO Bool
203+sendResponse :: Request -> HttpVersion -> Handle -> Response -> IO Bool
201−sendResponse hv handle (ResponseFile s hs fp) = do
204+sendResponse req hv handle (ResponseFile s hs fp) = do
202 mapM_ (S.hPut handle) $ L.toChunks $ toLazyByteString $ headers hv s hs False
205 mapM_ (S.hPut handle) $ L.toChunks $ toLazyByteString $ headers hv s hs False
203− unsafeSendFile handle fp
208+ unsafeSendFile handle fp
204− return $ lookup "content-length" hs /= Nothing
209+ return $ lookup "content-length" hs /= Nothing
205−sendResponse hv handle (ResponseEnumerator res) =
211+sendResponse req hv handle (ResponseEnumerator res) =
215+ | not (hasBody s req) = do
216+ liftIO $ mapM_ (S.hPut handle)
217+ $ L.toChunks $ toLazyByteString
218+ $ headers hv s hs False
208 go s hs =
220 go s hs =
210 $ E.enumList 1 [headers hv s hs isChunked']
222 $ E.enumList 1 [headers hv s hs isChunked']