@@ -14,7 +14,6 @@ import qualified Data.ByteString as B hiding (pack)
1414import qualified Data.ByteString.Builder as B
1515import qualified Data.ByteString.Char8 as B (pack, readInteger)
1616import qualified Data.ByteString.Lazy as L
17−import Data.Maybe
1817import Network.HTTP.Date
1918import qualified Network.HTTP.Types as H
2019import qualified Network.HTTP.Types.Header as H
@@ -34,7 +33,7 @@ data RspFileInfo = WithoutBody H.Status
3433conditionalRequest :: I.FileInfo
3534 -> H.ResponseHeaders -> IndexedHeader
3635 -> RspFileInfo
37−conditionalRequest finfo hs0 reqidx = case fromJust mx of
36+conditionalRequest finfo hs0 reqidx = case condition of
3837 nobody@(WithoutBody _) -> nobody
3938 WithBody s _ off len -> let hs = (H.hLastModified,date) :
4039 addContentHeaders hs0 off len size
@@ -43,10 +42,12 @@ conditionalRequest finfo hs0 reqidx = case fromJust mx of
4342 mtime = I.fileInfoTime finfo
4443 size = I.fileInfoSize finfo
4544 date = I.fileInfoDate finfo
46− mx = ifmodified reqidx size mtime
47− <|> ifunmodified reqidx size mtime
48− <|> ifrange reqidx size mtime
49− <|> unconditional reqidx size mtime
45+ mcondition = ifmodified reqidx size mtime
46+ <|> ifunmodified reqidx size mtime
47+ <|> ifrange reqidx size mtime
48+ condition = case mcondition of
49+ Nothing -> unconditional reqidx size
50+ Just x -> x
5051
5152----------------------------------------------------------------
5253
@@ -64,43 +65,43 @@ ifRange reqidx = reqidx ! idxIfRange >>= parseHTTPDate
6465ifmodified :: IndexedHeader -> Integer -> HTTPDate -> Maybe RspFileInfo
6566ifmodified reqidx size mtime = do
6667 date <- ifModifiedSince reqidx
67− if date /= mtime
68− then unconditional reqidx size mtime
69− else Just $ WithoutBody H.notModified304
68+ return $ if date /= mtime
69+ then unconditional reqidx size
70+ else WithoutBody H.notModified304
7071
7172ifunmodified :: IndexedHeader -> Integer -> HTTPDate -> Maybe RspFileInfo
7273ifunmodified reqidx size mtime = do
7374 date <- ifUnmodifiedSince reqidx
74− if date == mtime
75− then unconditional reqidx size mtime
76− else Just $ WithoutBody H.preconditionFailed412
75+ return $ if date == mtime
76+ then unconditional reqidx size
77+ else WithoutBody H.preconditionFailed412
7778
7879ifrange :: IndexedHeader -> Integer -> HTTPDate -> Maybe RspFileInfo
7980ifrange reqidx size mtime = do
8081 date <- ifRange reqidx
8182 rng <- reqidx ! idxRange
82− if date == mtime
83− then parseRange rng size
84− else Just $ WithBody H.ok200 [] 0 size
83+ return $ if date == mtime
84+ then parseRange rng size
85+ else WithBody H.ok200 [] 0 size
8586
86−unconditional :: IndexedHeader -> Integer -> HTTPDate -> Maybe RspFileInfo
87−unconditional reqidx size _ = case reqidx ! idxRange of
88− Nothing -> Just $ WithBody H.ok200 [] 0 size
87+unconditional :: IndexedHeader -> Integer -> RspFileInfo
88+unconditional reqidx size = case reqidx ! idxRange of
89+ Nothing -> WithBody H.ok200 [] 0 size
8990 Just rng -> parseRange rng size
9091
9192----------------------------------------------------------------
9293
93−parseRange :: ByteString -> Integer -> Maybe RspFileInfo
94+parseRange :: ByteString -> Integer -> RspFileInfo
9495parseRange rng size = case parseByteRanges rng of
95− Nothing -> Just $ WithoutBody H.requestedRangeNotSatisfiable416
96− Just [] -> Just $ WithoutBody H.requestedRangeNotSatisfiable416
96+ Nothing -> WithoutBody H.requestedRangeNotSatisfiable416
97+ Just [] -> WithoutBody H.requestedRangeNotSatisfiable416
9798 Just (r:_) -> let (!beg, !end) = checkRange r size
9899 !len = end - beg + 1
99100 s = if beg == 0 && end == size - 1 then
100101 H.ok200
101102 else
102103 H.partialContent206
103− in Just $ WithBody s [] beg len
104+ in WithBody s [] beg len
104105
105106checkRange :: H.ByteRange -> Integer -> (Integer, Integer)
106107checkRange (H.ByteRangeFrom beg) size = (beg, size - 1)