@@ -1,7 +1,10 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE BangPatterns #-}
4−module Network.Wai.Handler.Warp.RequestHeader (parseHeaderLines) where
4+module Network.Wai.Handler.Warp.RequestHeader (
6import Control.Exception (throwIO)
9import Control.Exception (throwIO)
7import Control.Monad (when)
10import Control.Monad (when)
@@ -15,7 +18,9 @@ import Foreign.Ptr (Ptr, plusPtr, minusPtr, nullPtr)
15import Foreign.Storable (peek)
18import Foreign.Storable (peek)
16import qualified Network.HTTP.Types as H
19import qualified Network.HTTP.Types as H
17import Network.Wai.Handler.Warp.Types
20import Network.Wai.Handler.Warp.Types
18−
21+import qualified Network.HTTP.Types.Header as HH
22+import qualified Data.Attoparsec.ByteString.Char8 as A8
23+import Control.Applicative ((<|>), (<$>))
20-- >>> :set -XOverloadedStrings
25-- >>> :set -XOverloadedStrings
@@ -149,3 +154,35 @@ parseHeader s =
149 let (k, rest) = S.breakByte 58 s -- ':'
154 let (k, rest) = S.breakByte 58 s -- ':'
150 rest' = S.dropWhile (\c -> c == 32 || c == 9) $ S.drop 1 rest
155 rest' = S.dropWhile (\c -> c == 32 || c == 9) $ S.drop 1 rest
151 in (CI.mk k, rest')
156 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
185+parseByteRanges :: S.ByteString -> Maybe HH.ByteRanges
186+parseByteRanges bs = case A8.parseOnly byteRangesParser bs of