@@ -160,7 +160,11 @@ sendResponse :: ByteString -- ^ default server value
160 -> IO Bool -- ^ Returing True if the connection is persistent.
160 -> IO Bool -- ^ Returing True if the connection is persistent.
161sendResponse defServer conn ii req reqidxhdr src response = do
161sendResponse defServer conn ii req reqidxhdr src response = do
162 hs <- addServerAndDate hs0
162 hs <- addServerAndDate hs0
163− if hasBody req s then do
163+ if hasBody s then do
164+ -- HEAD comes here even if it does not have body. We include HEAD
165+ -- responses here so that we generate appropriate content-length
164 -- See definition of rsp below for proper body stripping.
168 -- See definition of rsp below for proper body stripping.
165 sendRsp conn ii ver s hs rsp
169 sendRsp conn ii ver s hs rsp
166 T.tickle th
170 T.tickle th
@@ -178,9 +182,13 @@ sendResponse defServer conn ii req reqidxhdr src response = do
178 dc = dateCacher ii
182 dc = dateCacher ii
179 addServerAndDate = addDate dc rspidxhdr . addServer defServer rspidxhdr
183 addServerAndDate = addDate dc rspidxhdr . addServer defServer rspidxhdr
180 mRange = reqidxhdr ! idxRange
184 mRange = reqidxhdr ! idxRange
181− (isPersist,isChunked) = infoFromRequest req reqidxhdr
185+ (isPersist,isChunked0) = infoFromRequest req reqidxhdr
186+ isChunked = not isHead && isChunked0
182 (isKeepAlive, needsChunked) = infoFromResponse rspidxhdr (isPersist,isChunked)
187 (isKeepAlive, needsChunked) = infoFromResponse rspidxhdr (isPersist,isChunked)
188+ isHead = requestMethod req == H.methodHead
190+ | isHead = RspBuilder mempty False
183− rsp = case response of
191+ | otherwise = case response of
184 ResponseFile _ _ path mPart -> RspFile path mPart mRange (T.tickle th)
192 ResponseFile _ _ path mPart -> RspFile path mPart mRange (T.tickle th)
185 ResponseBuilder _ _ b -> RspBuilder b needsChunked
193 ResponseBuilder _ _ b -> RspBuilder b needsChunked
186 ResponseStream _ _ fb -> RspStream fb needsChunked th
194 ResponseStream _ _ fb -> RspStream fb needsChunked th
@@ -377,14 +385,12 @@ infoFromResponse rspidxhdr (isPersist,isChunked) = (isKeepAlive, needsChunked)
378----------------------------------------------------------------
386----------------------------------------------------------------
380−hasBody :: Request -> H.Status -> Bool
388+hasBody :: H.Status -> Bool
381−hasBody req s = not isHead
382− && sc /= 204
389+hasBody s = sc /= 204
383− && sc /= 304
390+ && sc /= 304
384− && sc >= 200
391+ && sc >= 200
386 sc = H.statusCode s
393 sc = H.statusCode s
387− isHead = requestMethod req == H.methodHead
389----------------------------------------------------------------
395----------------------------------------------------------------