@@ -43,15 +43,15 @@ fileRange :: IndexedHeader -> IndexedHeader
4343 -> FilePath -> Maybe FilePart
4444 -> IO (Either SomeException
4545 (H.Status, H.ResponseHeaders, Integer, Integer))
46−fileRange reqidxhdr rspidxhdr s0 hs0 path mpart = liftIO . try $
47− tryContentLength s0 hs0
46+fileRange reqidxhdr rspidxhdr s0 hs0 path mpart =
47+ liftIO . try $ checkContentLength s0 hs0
4848 where
4949 mRange = reqidxhdr ! idxRange
5050 mContentLength = rspidxhdr ! idxContentLength
5151 mContentRange = rspidxhdr ! idxContentRange
5252
53− tryContentLength s' hdr' = do
54− quad@(s, hdr, beg, len) <- tryMpart s' hdr' mpart
53+ checkContentLength s' hdr' = do
54+ quad@(s, hdr, beg, len) <- checkMpart s' hdr' mpart
5555 -- We respect Content-Length if exists.
5656 -- The validity of Content-Length's value is Applications's
5757 -- responsibility.
@@ -59,25 +59,25 @@ fileRange reqidxhdr rspidxhdr s0 hs0 path mpart = liftIO . try $
5959 Nothing -> return (s, addContentLength len hdr, beg, len)
6060 _ -> return quad
6161
62− tryMpart s hdr Nothing = do
62+ checkMpart s hdr Nothing = do
6363 -- We don't know the size of the file.
6464 -- Content-Length cannot help.
6565 -- Let's obtain it first.
6666 fileSize <- fromIntegral . P.fileSize <$> P.getFileStatus path
6767 -- Then, let's manipulate Range in HTTP request.
68− return $ tryRange s hdr mRange fileSize
68+ return $ checkRange s hdr mRange fileSize
6969 -- We respect Status.
7070 -- The validity of Status's value is Applications's responsibility.
71− tryMpart s hdr (Just part) = return (s, hdr', beg, len)
71+ checkMpart s hdr (Just part) = return (s, hdr', beg, len)
7272 where
7373 beg = filePartOffset part
7474 len = filePartByteCount part
75− hdr' = addRange mContentRange
76− addRange Nothing = addContentRange len beg (beg + len - 1) hdr
77− addRange _ = hdr
75+ end = beg + len - 1
76+ fileSize = filePartFileSize part
77+ hdr' = addRange hdr fileSize beg end mContentRange
7878
79− tryRange s hdr Nothing fileSize = (s, hdr, 0, fileSize)
80− tryRange s hdr (Just range) fileSize = case mhrange of
79+ checkRange s hdr Nothing fileSize = (s, hdr, 0, fileSize)
80+ checkRange s hdr (Just range) fileSize = case mhrange of
8181 Nothing -> (s, hdr, 0, fileSize)
8282 -- FIXME: original code checks if s is 200.
8383 Just hrange -> case hrange of
@@ -87,10 +87,17 @@ fileRange reqidxhdr rspidxhdr s0 hs0 path mpart = liftIO . try $
8787 where
8888 mhrange = parseByteRanges range >>= listToMaybe
8989
90− fromRange hdr total from to = (H.status206
91− ,addContentRange total from to hdr
92− ,from
93− ,to - from + 1)
90+ fromRange hdr fileSize from to = (status, hdr', beg, len)
91+ where
92+ status = H.status206
93+ hdr' = addRange hdr fileSize from to mContentRange
94+ beg = from
95+ len = to - from + 1
96+
97+ -- We respect Content-Range.
98+ -- The validity of Content-Range's value is Applications's responsibility.
99+ addRange hdr fileSize from to Nothing = addContentRange fileSize from to hdr
100+ addRange hdr _ _ _ _ = hdr
94101
95102----------------------------------------------------------------
96103