on master help sign in
if FilePart is specified, obtaining the file size from it (#328).

stat(2) is not called if FilePart is specified. This is a workaround for sophisticated applications.

commit7500bc7b8e50aea7c006845ce9e0064901225897 authorKazu Yamamoto <kazu@iij.ad.jp> dateWed 21 Jan 2015, 11:43 (12 years ago) parent036be26
1 file changed+19−14
warp/Network/Wai/Handler/Warp/Response.hs+19−14
warp/Network/Wai/Handler/Warp/Response.hs+19−14
@@ -66,23 +66,28 @@ mapRight f eith = case eith of
6666----------------------------------------------------------------
6767
6868fileRange :: H.Status -> H.ResponseHeaders -> FilePath
69− -> Maybe FilePart -> Maybe HeaderValue
69+ -> Maybe FilePart -> Maybe HeaderValue
7070 -> IO (Either IOException
7171 (H.Status, H.ResponseHeaders, Integer, Integer))
72−fileRange s0 hs0 path mPart mRange =
73− mapRight (fileRangeSized . fromIntegral . P.fileSize) <$>
74− try (P.getFileStatus path)
75− where
76− fileRangeSized :: Integer -> (H.Status, H.ResponseHeaders, Integer, Integer)
77− fileRangeSized fileSize =
78− let (beg, end, len, isEntire) = checkPartRange fileSize mPart mRange
79− hs1 = addContentLength len hs0
80− hs | isEntire = hs1
81− | otherwise = addContentRange beg end fileSize hs1
82− s | isEntire = s0
83− | otherwise = H.status206
84− in (s, hs, beg, len)
72+fileRange s0 hs0 path Nothing mRange =
73+ mapRight (fileRangeSized s0 hs0 Nothing mRange . fromIntegral . P.fileSize) <$>
74+ try (P.getFileStatus path)
75+fileRange s0 hs0 _ mPart@(Just part) mRange =
76+ return . Right $ fileRangeSized s0 hs0 mPart mRange size
77+ where
78+ size = filePartFileSize part
8579
80+fileRangeSized :: H.Status -> H.ResponseHeaders
81+ -> Maybe FilePart -> Maybe HeaderValue -> Integer
82+ -> (H.Status, H.ResponseHeaders, Integer, Integer)
83+fileRangeSized s0 hs0 mPart mRange fileSize = (s, hs, beg, len)
84+ where
85+ (beg, end, len, isEntire) = checkPartRange fileSize mPart mRange
86+ hs1 = addContentLength len hs0
87+ hs | isEntire = hs1
88+ | otherwise = addContentRange beg end fileSize hs1
89+ s | isEntire = s0
90+ | otherwise = H.status206
8691
8792checkPartRange :: Integer -> Maybe FilePart -> Maybe HeaderValue
8893 -> (Integer, Integer, Integer, Bool)