on master help sign in
Make sure HEAD response bodies are empty (fixes #468)
0d7072cMichael Snoyman
warp/Network/Wai/Handler/Warp/Response.hs+11−3
@@ -154,7 +154,11 @@ sendResponse :: ByteString -- ^ default server value
154sendResponse defServer conn ii req reqidxhdr src response = do
154sendResponse defServer conn ii req reqidxhdr src response = do
155 hs <- addServerAndDate hs0
155 hs <- addServerAndDate hs0
156 if hasBody s then do
156 if hasBody s then do
157− -- HEAD comes here even if it does not have body.
157+ -- HEAD comes here even if it does not have body. We include HEAD
158+ -- responses here so that we generate appropriate content-length
159+ -- headers below.
160+ --
161+ -- See definition of rsp below for proper body stripping.
158 sendRsp conn mfdc ver s hs rsp
162 sendRsp conn mfdc ver s hs rsp
159 T.tickle th
163 T.tickle th
160 return ret
164 return ret
@@ -178,8 +182,12 @@ sendResponse defServer conn ii req reqidxhdr src response = do
178 isHead = requestMethod req == H.methodHead
182 isHead = requestMethod req == H.methodHead
179 rsp = case response of
183 rsp = case response of
180 ResponseFile _ _ path mPart -> RspFile path mPart mRange isHead (T.tickle th)
184 ResponseFile _ _ path mPart -> RspFile path mPart mRange isHead (T.tickle th)
185+ ResponseBuilder _ _ b
186+ | isHead -> RspBuilder mempty False
181− ResponseBuilder _ _ b -> RspBuilder b needsChunked
187+ | otherwise -> RspBuilder b needsChunked
188+ ResponseStream _ _ fb
189+ | isHead -> RspBuilder mempty False
182− ResponseStream _ _ fb -> RspStream fb needsChunked th
190+ | otherwise -> RspStream fb needsChunked th
183 ResponseRaw raw _ -> RspRaw raw src (T.tickle th)
191 ResponseRaw raw _ -> RspRaw raw src (T.tickle th)
184 ret = case response of
192 ret = case response of
185 ResponseFile {} -> isPersist
193 ResponseFile {} -> isPersist