@@ -27,7 +27,6 @@ import Network.Wai
27import Network.Wai.Handler.Warp.Header
27import Network.Wai.Handler.Warp.Header
28import Network.Wai.Handler.Warp.ReadInt
28import Network.Wai.Handler.Warp.ReadInt
29import qualified Network.Wai.Handler.Warp.ResponseHeader as RH
29import qualified Network.Wai.Handler.Warp.ResponseHeader as RH
30−import Network.Wai.Handler.Warp.Settings
31import qualified Network.Wai.Handler.Warp.Timeout as T
30import qualified Network.Wai.Handler.Warp.Timeout as T
32import Network.Wai.Handler.Warp.Types
31import Network.Wai.Handler.Warp.Types
33import Network.Wai.Internal
32import Network.Wai.Internal
@@ -37,8 +36,7 @@ import qualified System.PosixCompat.Files as P
37----------------------------------------------------------------
36----------------------------------------------------------------
38----------------------------------------------------------------
37----------------------------------------------------------------
40−sendResponse :: Settings
41− -> InternalInfo -> Request -> Connection
39+sendResponse :: InternalInfo -> Request -> Connection
42 -> (forall a. IO a -> IO a) -- ^ restore masking state
40 -> (forall a. IO a -> IO a) -- ^ restore masking state
43 -> IndexedHeader
41 -> IndexedHeader
44 -> Response
42 -> Response
@@ -46,7 +44,7 @@ sendResponse :: Settings
47----------------------------------------------------------------
45----------------------------------------------------------------
49−sendResponse settings ii req conn restore reqidxhdr (ResponseFile s0 hs0 path mpart0) =
47+sendResponse ii req conn restore reqidxhdr (ResponseFile s0 hs0 path mpart0) =
50 restore $ headerAndLength >>= sendResponse'
48 restore $ headerAndLength >>= sendResponse'
52 hs = addAccept hs0
50 hs = addAccept hs0
@@ -87,12 +85,12 @@ sendResponse settings ii req conn restore reqidxhdr (ResponseFile s0 hs0 path mp
88 sendResponse' (Right (s, lengthyHeaders, beg, len))
86 sendResponse' (Right (s, lengthyHeaders, beg, len))
89 | hasBody s req = liftIO $ do
87 | hasBody s req = liftIO $ do
90− lheader <- composeHeader settings version s lengthyHeaders
88+ lheader <- composeHeader version s lengthyHeaders
91 connSendFile conn path beg len (T.tickle th) [lheader]
89 connSendFile conn path beg len (T.tickle th) [lheader]
92 T.tickle th
90 T.tickle th
93 return isPersist
91 return isPersist
94 | otherwise = liftIO $ do
92 | otherwise = liftIO $ do
95− composeHeader settings version s hs >>= connSendAll conn
93+ composeHeader version s hs >>= connSendAll conn
96 T.tickle th
94 T.tickle th
97 return isPersist -- FIXME isKeepAlive?
95 return isPersist -- FIXME isKeepAlive?
@@ -100,15 +98,15 @@ sendResponse settings ii req conn restore reqidxhdr (ResponseFile s0 hs0 path mp
100 (isPersist,_) = infoFromRequest req reqidxhdr
98 (isPersist,_) = infoFromRequest req reqidxhdr
102 sendResponse' (Left (_ :: SomeException)) =
100 sendResponse' (Left (_ :: SomeException)) =
103− sendResponse settings ii req conn restore reqidxhdr notFound
101+ sendResponse ii req conn restore reqidxhdr notFound
105 notFound = responseLBS H.status404 [(H.hContentType, "text/plain")] "File not found"
103 notFound = responseLBS H.status404 [(H.hContentType, "text/plain")] "File not found"
107----------------------------------------------------------------
105----------------------------------------------------------------
109−sendResponse settings ii req conn restore reqidxhdr (ResponseBuilder s hs b)
107+sendResponse ii req conn restore reqidxhdr (ResponseBuilder s hs b)
110 | hasBody s req = restore $ do
108 | hasBody s req = restore $ do
111− header <- composeHeaderBuilder settings version s hs needsChunked
109+ header <- composeHeaderBuilder version s hs needsChunked
113 | needsChunked = header `mappend` chunkedTransferEncoding b
111 | needsChunked = header `mappend` chunkedTransferEncoding b
114 `mappend` chunkedTransferTerminator
112 `mappend` chunkedTransferTerminator
@@ -118,7 +116,7 @@ sendResponse settings ii req conn restore reqidxhdr (ResponseBuilder s hs b)
118 T.tickle th
116 T.tickle th
119 return isKeepAlive
117 return isKeepAlive
120 | otherwise = restore $ do
118 | otherwise = restore $ do
121− composeHeader settings version s hs >>= connSendAll conn
119+ composeHeader version s hs >>= connSendAll conn
122 T.tickle th
120 T.tickle th
123 return isPersist
121 return isPersist
@@ -129,14 +127,14 @@ sendResponse settings ii req conn restore reqidxhdr (ResponseBuilder s hs b)
130----------------------------------------------------------------
128----------------------------------------------------------------
132−sendResponse settings ii req conn restore reqidxhdr (ResponseSource s hs withBodyFlush)
130+sendResponse ii req conn restore reqidxhdr (ResponseSource s hs withBodyFlush)
133 | hasBody s req = withBodyFlush $ \bodyFlush -> restore $ do
131 | hasBody s req = withBodyFlush $ \bodyFlush -> restore $ do
134− header <- liftIO $ composeHeaderBuilder settings version s hs needsChunked
132+ header <- liftIO $ composeHeaderBuilder version s hs needsChunked
135 let src = CL.sourceList [header] `mappend` cbody bodyFlush
133 let src = CL.sourceList [header] `mappend` cbody bodyFlush
136 src $$ builderToByteString =$ connSink conn th
134 src $$ builderToByteString =$ connSink conn th
137 return isKeepAlive
135 return isKeepAlive
138 | otherwise = withBodyFlush $ \_bodyFlush -> restore $ do -- make sure any cleanup is called
136 | otherwise = withBodyFlush $ \_bodyFlush -> restore $ do -- make sure any cleanup is called
139− composeHeader settings version s hs >>= connSendAll conn
137+ composeHeader version s hs >>= connSendAll conn
140 T.tickle th
138 T.tickle th
141 return isPersist
139 return isPersist
@@ -231,27 +229,22 @@ addAccept hdrs = (hAcceptRanges, "bytes") : hdrs
231addEncodingHeader :: H.ResponseHeaders -> H.ResponseHeaders
229addEncodingHeader :: H.ResponseHeaders -> H.ResponseHeaders
232addEncodingHeader hdrs = (hTransferEncoding, "chunked") : hdrs
230addEncodingHeader hdrs = (hTransferEncoding, "chunked") : hdrs
234−addServerHeader :: Settings -> H.ResponseHeaders -> H.ResponseHeaders
232+addServerHeader :: H.ResponseHeaders -> H.ResponseHeaders
235−addServerHeader settings hdrs = case lookup hServer hdrs of
233+addServerHeader hdrs = case lookup hServer hdrs of
236− Nothing -> warpVersionHeader settings : hdrs
234+ Nothing -> (hServer, defaultServerValue) : hdrs
237 Just _ -> hdrs
235 Just _ -> hdrs
239−warpVersionHeader :: Settings -> H.Header
240−warpVersionHeader settings = (hServer, settingsServerName settings)
242----------------------------------------------------------------
237----------------------------------------------------------------
244−composeHeader :: Settings
245− -> H.HttpVersion
239+composeHeader :: H.HttpVersion
246 -> H.Status
240 -> H.Status
247 -> H.ResponseHeaders
241 -> H.ResponseHeaders
248 -> IO ByteString
242 -> IO ByteString
249−composeHeader settings version s hs =
243+composeHeader version s hs =
250− RH.composeHeader version s
244+ RH.composeHeader version s $ addServerHeader hs
251− $ addServerHeader settings hs
245+
253−composeHeaderBuilder :: Settings -> H.HttpVersion -> H.Status -> H.ResponseHeaders -> Bool -> IO Builder
246+composeHeaderBuilder :: H.HttpVersion -> H.Status -> H.ResponseHeaders -> Bool -> IO Builder
254−composeHeaderBuilder settings ver s hs True =
247+composeHeaderBuilder ver s hs True =
255− fromByteString <$> composeHeader settings ver s (addEncodingHeader hs)
248+ fromByteString <$> composeHeader ver s (addEncodingHeader hs)
256−composeHeaderBuilder settings ver s hs False =
249+composeHeaderBuilder ver s hs False =
257− fromByteString <$> composeHeader settings ver s hs
250+ fromByteString <$> composeHeader ver s hs