on master help sign in
using the file info cache in sendResponse.
commite65617f565454b69ad2ce5bcc8692ec3b4c46827 authorKazu Yamamoto <kazu@iij.ad.jp> dateTue 1 Dec 2015, 10:57 (11 years ago) parentaa4ad3a
3 files changed+21−11
warp/Network/Wai/Handler/Warp/FileInfoCache.hs+1 warp/Network/Wai/Handler/Warp/Response.hs+18−10 warp/test/ResponseSpec.hs+2−1
warp/Network/Wai/Handler/Warp/FileInfoCache.hs+1
@@ -5,6 +5,7 @@ module Network.Wai.Handler.Warp.FileInfoCache (
55 FileInfo(..)
66 -- * Functions
77 , withFileInfoCache
8+ , getInfo -- test purpose only
89 ) where
910
1011import Control.Exception as E
warp/Network/Wai/Handler/Warp/Response.hs+18−10
@@ -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
warp/test/ResponseSpec.hs+2−1
@@ -9,6 +9,7 @@ import Network (connectTo, PortID (PortNumber))
99import Network.HTTP.Types
1010import Network.Wai
1111import Network.Wai.Handler.Warp
12+import Network.Wai.Handler.Warp.FileInfoCache
1213import Network.Wai.Handler.Warp.Response
1314import RunSpec (withApp)
1415import System.IO (hClose, hFlush)
@@ -76,7 +77,7 @@ testFileRange :: String
7677 -> Either String (Status, ResponseHeaders, Integer, Integer)
7778 -> Spec
7879testFileRange desc s rsphdr file mPart mRange ans = it desc $ do
79− eres <- fileRange s rsphdr file mPart mRange
80+ eres <- fileRange s rsphdr file mPart mRange getInfo
8081 let res = case eres of
8182 Left e -> Left $ show e
8283 Right r -> Right r