@@ -57,24 +57,31 @@ import qualified System.PosixCompat.Files as P
5757-- $setup
5858-- >>> :set -XOverloadedStrings
5959
60+mapRight :: (b -> c) -> Either a b -> Either a c
61+mapRight f eith = case eith of
62+ Right x -> Right (f x)
63+ Left l -> Left l
64+
6065----------------------------------------------------------------
6166
6267fileRange :: H.Status -> H.ResponseHeaders -> FilePath
6368 -> Maybe FilePart -> Maybe HeaderValue
6469 -> IO (Either SomeException
6570 (H.Status, H.ResponseHeaders, Integer, Integer))
66−fileRange s0 hs0 path mPart mRange = try $ do
67− fileSize <- checkFileSize mPart
68− let (beg, end, len, isEntire) = checkPartRange fileSize mPart mRange
69− let hs1 = addContentLength len hs0
70− hs | isEntire = hs1
71− | otherwise = addContentRange beg end fileSize hs1
72− s | isEntire = s0
73− | otherwise = H.status206
74− return (s, hs, beg, len)
71+fileRange s0 hs0 path mPart mRange =
72+ mapRight (fileRangeSized . fromIntegral . P.fileSize) <$>
73+ try (P.getFileStatus path)
7574 where
76− checkFileSize Nothing = fromIntegral . P.fileSize <$> P.getFileStatus path
77− checkFileSize (Just part) = return $ filePartFileSize part
75+ fileRangeSized :: Integer -> (H.Status, H.ResponseHeaders, Integer, Integer)
76+ fileRangeSized fileSize =
77+ let (beg, end, len, isEntire) = checkPartRange fileSize mPart mRange
78+ hs1 = addContentLength len hs0
79+ hs | isEntire = hs1
80+ | otherwise = addContentRange beg end fileSize hs1
81+ s | isEntire = s0
82+ | otherwise = H.status206
83+ in (s, hs, beg, len)
84+
7885
7986checkPartRange :: Integer -> Maybe FilePart -> Maybe HeaderValue
8087 -> (Integer, Integer, Integer, Bool)