@@ -57,6 +57,7 @@ import Network.Wai
5757import Network.Wai.Handler.Warp.Buffer (toBuilderBuffer)
5858import qualified Network.Wai.Handler.Warp.Date as D
5959import qualified Network.Wai.Handler.Warp.FdCache as F
60+import qualified Network.Wai.Handler.Warp.FileInfoCache as I
6061import Network.Wai.Handler.Warp.Header
6162import Network.Wai.Handler.Warp.IO (toBufIOWith)
6263import Network.Wai.Handler.Warp.ResponseHeader
@@ -77,11 +78,17 @@ import qualified Paths_warp
7778
7879fileRange :: H.Status -> H.ResponseHeaders -> FilePath
7980 -> Maybe FilePart -> Maybe HeaderValue
81+ -> (FilePath -> IO I.FileInfo)
8082 -> IO (Either IOException
8183 (H.Status, H.ResponseHeaders, Integer, Integer))
82−fileRange s0 hs0 path Nothing mRange =
83− fmap (fileRangeSized s0 hs0 Nothing mRange) <$> tryGetFileSize path -- fixme: using fileInfo
84−fileRange s0 hs0 _ mPart@(Just part) mRange =
84+fileRange s0 hs0 path Nothing mRange get = do
85+ efinfo <- try (get path)
86+ case efinfo of
87+ Left e -> return $ Left e
88+ Right finfo -> do
89+ let ret = fileRangeSized s0 hs0 Nothing mRange $ I.fileInfoSize finfo
90+ return $ Right ret
91+fileRange s0 hs0 _ mPart@(Just part) mRange _ =
8592 return . Right $ fileRangeSized s0 hs0 mPart mRange size
8693 where
8794 size = filePartFileSize part
@@ -155,7 +162,7 @@ sendResponse defServer conn ii req reqidxhdr src response = do
155162 hs <- addServerAndDate hs0
156163 if hasBody req s then do
157164 -- See definition of rsp below for proper body stripping.
158− sendRsp conn mfdc ver s hs rsp
165+ sendRsp conn ii ver s hs rsp
159166 T.tickle th
160167 return ret
161168 else do
@@ -169,7 +176,6 @@ sendResponse defServer conn ii req reqidxhdr src response = do
169176 rspidxhdr = indexResponseHeader hs0
170177 th = threadHandle ii
171178 dc = dateCacher ii
172− mfdc = fdCacher ii
173179 addServerAndDate = addDate dc rspidxhdr . addServer defServer rspidxhdr
174180 mRange = reqidxhdr ! idxRange
175181 (isPersist,isChunked) = infoFromRequest req reqidxhdr
@@ -220,20 +226,20 @@ data Rsp = RspFile FilePath (Maybe FilePart) (Maybe HeaderValue) (IO ())
220226----------------------------------------------------------------
221227
222228sendRsp :: Connection
223− -> Maybe F.MutableFdCache
229+ -> InternalInfo
224230 -> H.HttpVersion
225231 -> H.Status
226232 -> H.ResponseHeaders
227233 -> Rsp
228234 -> IO ()
229−sendRsp conn mfdc ver s0 hs0 (RspFile path mPart mRange hook) = do
230− ex <- fileRange s0 hs0 path mPart mRange
235+sendRsp conn ii ver s0 hs0 (RspFile path mPart mRange hook) = do
236+ ex <- fileRange s0 hs0 path mPart mRange get
231237 case ex of
232238 Left _ex ->
233239#ifdef WARP_DEBUG
234240 print _ex >>
235241#endif
236− sendRsp conn mfdc ver s2 hs2 (RspBuilder body True)
242+ sendRsp conn ii ver s2 hs2 (RspBuilder body True)
237243 Right (s, hs, beg, len)
238244 | len >= 0 -> do
239245 lheader <- composeHeader ver s hs
@@ -251,13 +257,15 @@ sendRsp conn mfdc ver s0 hs0 (RspFile path mPart mRange hook) = do
251257#endif
252258 connSendFile conn fid beg len hook' [lheader]
253259 | otherwise ->
254− sendRsp conn mfdc ver H.status416
260+ sendRsp conn ii ver H.status416
255261 (filter (\(k, _) -> k /= "content-length") hs)
256262 (RspBuilder mempty True)
257263 where
258264 s2 = H.status404
259265 hs2 = replaceHeader H.hContentType "text/plain; charset=utf-8" hs0
260266 body = byteString "File not found"
267+ mfdc = fdCacher ii
268+ get = fileInfo ii
261269
262270----------------------------------------------------------------
263271