on master help sign in
ResponseBuilder constructor
commit95a4d23a18a5782926afc9053aaa90753be2ba23 authorMichael <michael@snoyman.com> dateThu 6 Jan 2011, 08:09 (16 years ago) parentd0ab041
3 files changed+19−5
Network/Wai/Handler/Warp.hs+16−2 UtilHelper.hs+2−2 pong.hs+1−1
Network/Wai/Handler/Warp.hs+16−2
@@ -53,9 +53,10 @@ import Data.Enumerator.IO (iterHandle, enumHandle)
5353import Blaze.ByteString.Builder.Enumerator (builderToByteString)
5454import Blaze.ByteString.Builder.HTTP
5555 (chunkedTransferEncoding, chunkedTransferTerminator)
56−import Blaze.ByteString.Builder (fromByteString, Builder, toLazyByteString)
56+import Blaze.ByteString.Builder
57+ (fromByteString, Builder, toLazyByteString, toByteStringIO)
5758import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
58−import Data.Monoid (mconcat)
59+import Data.Monoid (mconcat, mappend)
5960import Network.Socket.SendFile (sendFile)
6061
6162import Control.Monad.IO.Class (liftIO)
@@ -232,6 +233,19 @@ sendResponse req hv socket (ResponseFile s hs fp) = do
232233 sendFile socket fp
233234 return $ lookup "content-length" hs /= Nothing
234235 else return True
236+sendResponse req hv socket (ResponseBuilder s hs b) = do
237+ toByteStringIO (Sock.sendAll socket) b'
238+ return isKeepAlive
239+ where
240+ b' =
241+ if isChunked'
242+ then headers hv s hs True
243+ `mappend` chunkedTransferEncoding b
244+ `mappend` chunkedTransferTerminator
245+ else headers hv s hs False `mappend` b
246+ hasLength = lookup "content-length" hs /= Nothing
247+ isChunked' = isChunked hv && not hasLength
248+ isKeepAlive = isChunked' || hasLength
235249sendResponse req hv socket (ResponseEnumerator res) =
236250 res go
237251 where
UtilHelper.hs+2−2
@@ -8,8 +8,8 @@ mimeTypes' :: IO [(String, String)]
88mimeTypes' = do
99 s <- readFile "mime.types"
1010 let go ('#':_) = Nothing
11− go s =
12− case words s of
11+ go x =
12+ case words x of
1313 [a, b] -> Just (b, a)
1414 _ -> Nothing
1515 let pairs = mapMaybe go $ lines s
pong.hs+1−1
@@ -3,7 +3,7 @@ import Network.Wai
33import Network.Wai.Handler.Warp
44import Blaze.ByteString.Builder (fromByteString)
55
6−main = run 3000 $ const $ return $ responseBuilder
6+main = run 3000 $ const $ return $ ResponseBuilder
77 status200
88 [ ("Content-Type", "text/plain")
99 , ("Content-Length", "4")