@@ -9,7 +9,7 @@ module Network.Wai.Handler.Warp.RequestHeader (
9import Control.Exception (throwIO)
9import Control.Exception (throwIO)
10import Control.Monad (when)
10import Control.Monad (when)
11import qualified Data.ByteString as S
11import qualified Data.ByteString as S
12−import qualified Data.ByteString.Char8 as B (unpack)
12+import qualified Data.ByteString.Char8 as B (unpack, readInteger)
13import Data.ByteString.Internal (ByteString(..), memchr)
13import Data.ByteString.Internal (ByteString(..), memchr)
14import qualified Data.CaseInsensitive as CI
14import qualified Data.CaseInsensitive as CI
15import Data.Word (Word8)
15import Data.Word (Word8)
@@ -19,8 +19,6 @@ import Foreign.Storable (peek)
19import qualified Network.HTTP.Types as H
19import qualified Network.HTTP.Types as H
20import Network.Wai.Handler.Warp.Types
20import Network.Wai.Handler.Warp.Types
21import qualified Network.HTTP.Types.Header as HH
21import qualified Network.HTTP.Types.Header as HH
22−import qualified Data.Attoparsec.ByteString.Char8 as A8
23−import Control.Applicative ((<|>), (<$>))
25-- >>> :set -XOverloadedStrings
23-- >>> :set -XOverloadedStrings
@@ -155,34 +153,30 @@ parseHeader s =
155 rest' = S.dropWhile (\c -> c == 32 || c == 9) $ S.drop 1 rest
153 rest' = S.dropWhile (\c -> c == 32 || c == 9) $ S.drop 1 rest
156 in (CI.mk k, rest')
154 in (CI.mk k, rest')
158−byteRangesParser :: A8.Parser HH.ByteRanges
159−byteRangesParser = do
160− _ <- A8.string "bytes="
162− rest <- maybeMoreRanges
165− range = rangeFromTo <|> rangeSuffix
169− mt <- Just <$> A8.decimal <|> return Nothing
172− Just t -> HH.ByteRangeFromTo f t
173− Nothing -> HH.ByteRangeFrom f
177− return $ HH.ByteRangeSuffix s
178− maybeMoreRanges = moreRanges <|> return []
182− rest <- maybeMoreRanges
185parseByteRanges :: S.ByteString -> Maybe HH.ByteRanges
156parseByteRanges :: S.ByteString -> Maybe HH.ByteRanges
186−parseByteRanges bs = case A8.parseOnly byteRangesParser bs of
157+parseByteRanges bs1 = do
158+ bs2 <- stripPrefix "bytes=" bs1
159+ (r, bs3) <- range bs2
163+ case stripPrefix "-" bs2 of
165+ (i, bs4) <- B.readInteger bs3
166+ Just (HH.ByteRangeSuffix i, bs4)
187− Left _ -> Nothing
167+ Nothing -> do
188− Right br -> Just br
168+ (i, bs3) <- B.readInteger bs2
169+ bs4 <- stripPrefix "-" bs3
170+ case B.readInteger bs4 of
171+ Nothing -> Just (HH.ByteRangeFrom i, bs4)
172+ Just (j, bs5) -> Just (HH.ByteRangeFromTo i j, bs5)
174+ case stripPrefix "," bs3 of
175+ Nothing -> Just (front [])
177+ (r, bs5) <- range bs4
178+ ranges (front . (r:)) bs5
181+ | x `S.isPrefixOf` y = Just (S.drop (S.length x) y)
182+ | otherwise = Nothing