@@ -42,12 +42,13 @@ import Data.Monoid (mappend, mempty)
4242import Data.Version (showVersion)
4343import qualified Network.HTTP.Types as H
4444import Network.Wai
45−import qualified Network.Wai.Handler.Warp.Date as D
4645import Network.Wai.Handler.Warp.Buffer (toBlazeBuffer)
46+import qualified Network.Wai.Handler.Warp.Date as D
47+import qualified Network.Wai.Handler.Warp.FdCache as F
4748import Network.Wai.Handler.Warp.Header
4849import Network.Wai.Handler.Warp.IO (toBufIOWith)
49−import Network.Wai.Handler.Warp.ResponseHeader
5050import Network.Wai.Handler.Warp.RequestHeader (parseByteRanges)
51+import Network.Wai.Handler.Warp.ResponseHeader
5152import qualified Network.Wai.Handler.Warp.Timeout as T
5253import Network.Wai.Handler.Warp.Types
5354import Network.Wai.Internal
@@ -181,7 +182,7 @@ sendResponse defServer conn ii req reqidxhdr src response = do
181182 hs <- addServerAndDate hs0
182183 if hasBody s then do
183184 -- HEAD comes here even if it does not have body.
184− sendRsp conn ver s hs rsp
185+ sendRsp conn mfdc ver s hs rsp
185186 T.tickle th
186187 return ret
187188 else do
@@ -195,6 +196,7 @@ sendResponse defServer conn ii req reqidxhdr src response = do
195196 rspidxhdr = indexResponseHeader hs0
196197 th = threadHandle ii
197198 dc = dateCacher ii
199+ mfdc = fdCacher ii
198200 addServerAndDate = addDate dc rspidxhdr . addServer defServer rspidxhdr
199201 mRange = reqidxhdr ! idxRange
200202 (isPersist,isChunked0) = infoFromRequest req reqidxhdr
@@ -222,28 +224,40 @@ data Rsp = RspFile FilePath (Maybe FilePart) (Maybe HeaderValue) Bool (IO ())
222224----------------------------------------------------------------
223225
224226sendRsp :: Connection
227+ -> Maybe F.MutableFdCache
225228 -> H.HttpVersion
226229 -> H.Status
227230 -> H.ResponseHeaders
228231 -> Rsp
229232 -> IO ()
230−sendRsp conn ver s0 hs0 (RspFile path mPart mRange isHead hook) = do
233+sendRsp conn mfdc ver s0 hs0 (RspFile path mPart mRange isHead hook) = do
231234 ex <- fileRange s0 hs path mPart mRange
232235 case ex of
233236 Left _ex ->
234237#ifdef WARP_DEBUG
235238 print _ex >>
236239#endif
237− sendRsp conn ver s2 hs2 (RspBuilder body True)
240+ sendRsp conn mfdc ver s2 hs2 (RspBuilder body True)
238241 Right (s, hs1, beg, len)
239242 | len >= 0 ->
240243 if isHead then
241− sendRsp conn ver s hs1 (RspBuilder mempty False)
244+ sendRsp conn mfdc ver s hs1 (RspBuilder mempty False)
242245 else do
243246 lheader <- composeHeader ver s hs1
244− connSendFile conn path beg len hook [lheader]
247+#ifdef SENDFILEFD
248+ (mfd, hook') <- case mfdc of
249+ Nothing -> return (Nothing, hook)
250+ Just fdc -> do
251+ (fd, fresher) <- F.getFd fdc path
252+ return (Just fd, hook >> fresher)
253+ let fid = FileId path mfd
254+#else
255+ let fid = FileId path Nothing
256+ hook' = hook
257+#endif
258+ connSendFile conn fid beg len hook' [lheader]
245259 | otherwise -> do
246− sendRsp conn ver H.status416
260+ sendRsp conn mfdc ver H.status416
247261 (filter (\(k, _) -> k /= "content-length") hs1)
248262 (RspBuilder mempty True)
249263 where
@@ -254,7 +268,7 @@ sendRsp conn ver s0 hs0 (RspFile path mPart mRange isHead hook) = do
254268
255269----------------------------------------------------------------
256270
257−sendRsp conn ver s hs (RspBuilder body needsChunked) = do
271+sendRsp conn _ ver s hs (RspBuilder body needsChunked) = do
258272 header <- composeHeaderBuilder ver s hs needsChunked
259273 let hdrBdy
260274 | needsChunked = header <> chunkedTransferEncoding body
@@ -266,7 +280,7 @@ sendRsp conn ver s hs (RspBuilder body needsChunked) = do
266280
267281----------------------------------------------------------------
268282
269−sendRsp conn ver s hs (RspStream streamingBody needsChunked th) = do
283+sendRsp conn _ ver s hs (RspStream streamingBody needsChunked th) = do
270284 header <- composeHeaderBuilder ver s hs needsChunked
271285 (recv, finish) <- newBlazeRecv $ reuseBufferStrategy
272286 $ toBlazeBuffer (connWriteBuffer conn) (connBufferSize conn)
@@ -289,7 +303,7 @@ sendRsp conn ver s hs (RspStream streamingBody needsChunked th) = do
289303
290304----------------------------------------------------------------
291305
292−sendRsp conn _ _ _ (RspRaw withApp src tickle) =
306+sendRsp conn _ _ _ _ (RspRaw withApp src tickle) =
293307 withApp recv send
294308 where
295309 recv = do