on master help sign in
ResponseBuilder constructor
95a4d23Michael
Network/Wai/Handler/Warp.hs+16−2
@@ -53,9 +53,10 @@ import Data.Enumerator.IO (iterHandle, enumHandle)
53import Blaze.ByteString.Builder.Enumerator (builderToByteString)
53import Blaze.ByteString.Builder.Enumerator (builderToByteString)
54import Blaze.ByteString.Builder.HTTP
54import Blaze.ByteString.Builder.HTTP
55 (chunkedTransferEncoding, chunkedTransferTerminator)
55 (chunkedTransferEncoding, chunkedTransferTerminator)
56+import Blaze.ByteString.Builder
56−import Blaze.ByteString.Builder (fromByteString, Builder, toLazyByteString)
57+ (fromByteString, Builder, toLazyByteString, toByteStringIO)
57import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
58import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
58−import Data.Monoid (mconcat)
59+import Data.Monoid (mconcat, mappend)
59import Network.Socket.SendFile (sendFile)
60import Network.Socket.SendFile (sendFile)
60
61
61import Control.Monad.IO.Class (liftIO)
62import Control.Monad.IO.Class (liftIO)
@@ -232,6 +233,19 @@ sendResponse req hv socket (ResponseFile s hs fp) = do
232 sendFile socket fp
233 sendFile socket fp
233 return $ lookup "content-length" hs /= Nothing
234 return $ lookup "content-length" hs /= Nothing
234 else return True
235 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
235sendResponse req hv socket (ResponseEnumerator res) =
249sendResponse req hv socket (ResponseEnumerator res) =
236 res go
250 res go
237 where
251 where
UtilHelper.hs+2−2
@@ -8,8 +8,8 @@ mimeTypes' :: IO [(String, String)]
8mimeTypes' = do
8mimeTypes' = do
9 s <- readFile "mime.types"
9 s <- readFile "mime.types"
10 let go ('#':_) = Nothing
10 let go ('#':_) = Nothing
11− go s =
11+ go x =
12− case words s of
12+ case words x of
13 [a, b] -> Just (b, a)
13 [a, b] -> Just (b, a)
14 _ -> Nothing
14 _ -> Nothing
15 let pairs = mapMaybe go $ lines s
15 let pairs = mapMaybe go $ lines s
pong.hs+1−1
@@ -3,7 +3,7 @@ import Network.Wai
3import Network.Wai.Handler.Warp
3import Network.Wai.Handler.Warp
4import Blaze.ByteString.Builder (fromByteString)
4import Blaze.ByteString.Builder (fromByteString)
5
5
6−main = run 3000 $ const $ return $ responseBuilder
6+main = run 3000 $ const $ return $ ResponseBuilder
7 status200
7 status200
8 [ ("Content-Type", "text/plain")
8 [ ("Content-Type", "text/plain")
9 , ("Content-Length", "4")
9 , ("Content-Length", "4")