@@ -301,6 +301,20 @@ responseHeaderToBuilder b (x, y) = b
301301 `mappend` copyByteString y
302302 `mappend` newlineBuilder
303303
304+checkPersist :: Request -> Bool
305+checkPersist req
306+ | ver == H.http11 = checkPersist11 conn
307+ | otherwise = checkPersist10 conn
308+ where
309+ ver = httpVersion req
310+ conn = lookup "connection" $ requestHeaders req
311+ checkPersist11 (Just x)
312+ | CI.foldCase x == "close" = False
313+ checkPersist11 _ = True
314+ checkPersist10 (Just x)
315+ | CI.foldCase x == "keep-alive" = True
316+ checkPersist10 _ = False
317+
304318isChunked :: H.HttpVersion -> Bool
305319isChunked = (==) H.http11
306320
@@ -320,6 +334,7 @@ sendResponse th req socket (ResponseFile s hs fp mpart) = do
320334 let cl = filePartByteCount part
321335 return (("Content-Length", B.pack $ show cl):hs, fromIntegral cl)
322336 Sock.sendMany socket $ L.toChunks $ toLazyByteString $ headers (httpVersion req) s hs' False
337+ let isPersist= checkPersist req
323338 if hasBody s req
324339 then do
325340 case mpart of
@@ -332,8 +347,8 @@ sendResponse th req socket (ResponseFile s hs fp mpart) = do
332347 , rangeLength = filePartByteCount part
333348 } (T.tickle th)
334349 T.tickle th
335− return True
336− else return True
350+ return isPersist
351+ else return isPersist
337352sendResponse th req socket (ResponseBuilder s hs b)
338353 | hasBody s req = do
339354 toByteStringIO (\bs -> do
@@ -356,7 +371,8 @@ sendResponse th req socket (ResponseBuilder s hs b)
356371 else headers (httpVersion req) s hs False `mappend` b
357372 hasLength = lookup "content-length" hs /= Nothing
358373 isChunked' = isChunked (httpVersion req) && not hasLength
359− isKeepAlive = isChunked' || hasLength
374+ isPersist = checkPersist req
375+ isKeepAlive = isPersist && (isChunked' || hasLength)
360376sendResponse th req socket (ResponseEnumerator res) =
361377 res go
362378 where
@@ -373,7 +389,8 @@ sendResponse th req socket (ResponseEnumerator res) =
373389 where
374390 hasLength = lookup "content-length" hs /= Nothing
375391 isChunked' = isChunked (httpVersion req) && not hasLength
376− isKeepAlive = isChunked' || hasLength
392+ isPersist = checkPersist req
393+ isKeepAlive = isPersist && (isChunked' || hasLength)
377394 chunk' i = if isChunked'
378395 then E.joinI $ chunk $$ i
379396 else i