on master help sign in
creating File module.
commit74158dbfa19124939816f9502c6e9c9cb3d53082 authorKazu Yamamoto <kazu@iij.ad.jp> dateThu 3 Dec 2015, 11:15 (11 years ago) parent2936c25
3 files changed+49−31
warp/Network/Wai/Handler/Warp/File.hs+47 warp/Network/Wai/Handler/Warp/Response.hs+1−31 warp/warp.cabal+1
warp/Network/Wai/Handler/Warp/File.hsnew file+47
@@ -0,0 +1,47 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
3+{-# LANGUAGE TupleSections #-}
4+{-# LANGUAGE RankNTypes #-}
5+{-# LANGUAGE CPP #-}
6+
7+module Network.Wai.Handler.Warp.File where
8+
9+#if __GLASGOW_HASKELL__ < 709
10+import Control.Applicative
11+#endif
12+import Control.Exception
13+import Data.Maybe
14+import qualified Network.HTTP.Types as H
15+import Network.Wai
16+import qualified Network.Wai.Handler.Warp.FileInfoCache as I
17+import Network.Wai.Handler.Warp.Types
18+import Network.Wai.Internal
19+
20+----------------------------------------------------------------
21+
22+fileRange :: H.Status -> H.ResponseHeaders -> FilePath
23+ -> Maybe FilePart -> Maybe HeaderValue
24+ -> (FilePath -> IO I.FileInfo)
25+ -> IO (Either IOException
26+ (H.Status, H.ResponseHeaders, Integer, Integer))
27+fileRange s0 hs0 path Nothing mRange get = do
28+ efinfo <- try (get path)
29+ case efinfo of
30+ Left e -> return $ Left e
31+ Right finfo -> do
32+ let ret = fileRangeSized s0 hs0 Nothing mRange $ I.fileInfoSize finfo
33+ return $ Right ret
34+fileRange s0 hs0 _ mPart@(Just part) mRange _ =
35+ return . Right $ fileRangeSized s0 hs0 mPart mRange size
36+ where
37+ size = filePartFileSize part
38+
39+fileRangeSized :: H.Status -> H.ResponseHeaders
40+ -> Maybe FilePart -> Maybe HeaderValue -> Integer
41+ -> (H.Status, H.ResponseHeaders, Integer, Integer)
42+fileRangeSized s0 hs0 mPart mRange fileSize = (s, hs, beg, len)
43+ where
44+ part = fromMaybe (chooseFilePart fileSize mRange) mPart
45+ beg = filePartOffset part
46+ len = filePartByteCount part
47+ (s, hs) = adjustForFilePart s0 hs0 $ FilePart beg len fileSize
warp/Network/Wai/Handler/Warp/Response.hs+1−31
@@ -26,7 +26,6 @@ import Blaze.ByteString.Builder.HTTP (chunkedTransferEncoding, chunkedTransferTe
2626#if __GLASGOW_HASKELL__ < 709
2727import Control.Applicative
2828#endif
29−import Control.Exception
3029import Control.Monad (unless, when)
3130import Data.Array ((!))
3231import Data.ByteString (ByteString)
@@ -57,7 +56,7 @@ import Network.Wai
5756import Network.Wai.Handler.Warp.Buffer (toBuilderBuffer)
5857import qualified Network.Wai.Handler.Warp.Date as D
5958import qualified Network.Wai.Handler.Warp.FdCache as F
60−import qualified Network.Wai.Handler.Warp.FileInfoCache as I
59+import Network.Wai.Handler.Warp.File
6160import Network.Wai.Handler.Warp.Header
6261import Network.Wai.Handler.Warp.IO (toBufIOWith)
6362import Network.Wai.Handler.Warp.ResponseHeader
@@ -77,35 +76,6 @@ import qualified Paths_warp
7776
7877----------------------------------------------------------------
7978
80−fileRange :: H.Status -> H.ResponseHeaders -> FilePath
81− -> Maybe FilePart -> Maybe HeaderValue
82− -> (FilePath -> IO I.FileInfo)
83− -> IO (Either IOException
84− (H.Status, H.ResponseHeaders, Integer, Integer))
85−fileRange s0 hs0 path Nothing mRange get = do
86− efinfo <- try (get path)
87− case efinfo of
88− Left e -> return $ Left e
89− Right finfo -> do
90− let ret = fileRangeSized s0 hs0 Nothing mRange $ I.fileInfoSize finfo
91− return $ Right ret
92−fileRange s0 hs0 _ mPart@(Just part) mRange _ =
93− return . Right $ fileRangeSized s0 hs0 mPart mRange size
94− where
95− size = filePartFileSize part
96−
97−fileRangeSized :: H.Status -> H.ResponseHeaders
98− -> Maybe FilePart -> Maybe HeaderValue -> Integer
99− -> (H.Status, H.ResponseHeaders, Integer, Integer)
100−fileRangeSized s0 hs0 mPart mRange fileSize = (s, hs, beg, len)
101− where
102− part = fromMaybe (chooseFilePart fileSize mRange) mPart
103− beg = filePartOffset part
104− len = filePartByteCount part
105− (s, hs) = adjustForFilePart s0 hs0 $ FilePart beg len fileSize
106−
107−----------------------------------------------------------------
108−
10979-- | Sending a HTTP response to 'Connection' according to 'Response'.
11080--
11181-- Applications/middlewares MUST specify a proper 'H.ResponseHeaders'.
warp/warp.cabal+1
@@ -66,6 +66,7 @@ Library
6666 Network.Wai.Handler.Warp.Counter
6767 Network.Wai.Handler.Warp.Date
6868 Network.Wai.Handler.Warp.FdCache
69+ Network.Wai.Handler.Warp.File
6970 Network.Wai.Handler.Warp.FileInfoCache
7071 Network.Wai.Handler.Warp.HTTP2
7172 Network.Wai.Handler.Warp.HTTP2.EncodeFrame