on master help sign in
merged http-attoparsec (byte ranges parser) package and replaced dependency to it with attoparsec
ed9d8f7Tero Laitinen
warp/Network/Wai/Handler/Warp/RequestHeader.hs+39−2
@@ -1,7 +1,10 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE BangPatterns #-}
3
3
4−module Network.Wai.Handler.Warp.RequestHeader (parseHeaderLines) where
4+module Network.Wai.Handler.Warp.RequestHeader (
5+ parseHeaderLines
6+ , parseByteRanges
7+ ) where
5
8
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 ((<|>), (<$>))
19-- $setup
24-- $setup
20-- >>> :set -XOverloadedStrings
25-- >>> :set -XOverloadedStrings
21
26
@@ -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')
157+
158+byteRangesParser :: A8.Parser HH.ByteRanges
159+byteRangesParser = do
160+ _ <- A8.string "bytes="
161+ br <- range
162+ rest <- maybeMoreRanges
163+ return $ br:rest
164+ where
165+ range = rangeFromTo <|> rangeSuffix
166+ rangeFromTo = do
167+ f <- A8.decimal
168+ _ <- A8.char '-'
169+ mt <- Just <$> A8.decimal <|> return Nothing
170+
171+ return $ case mt of
172+ Just t -> HH.ByteRangeFromTo f t
173+ Nothing -> HH.ByteRangeFrom f
174+ rangeSuffix = do
175+ _ <- A8.char '-'
176+ s <- A8.decimal
177+ return $ HH.ByteRangeSuffix s
178+ maybeMoreRanges = moreRanges <|> return []
179+ moreRanges = do
180+ _ <- A8.char ','
181+ r <- range
182+ rest <- maybeMoreRanges
183+ return $ r:rest
184+
185+parseByteRanges :: S.ByteString -> Maybe HH.ByteRanges
186+parseByteRanges bs = case A8.parseOnly byteRangesParser bs of
187+ Left _ -> Nothing
188+ Right br -> Just br
warp/Network/Wai/Handler/Warp/Response.hs+1−1
@@ -31,7 +31,6 @@ import Data.Monoid ((<>))
31import Data.Monoid (mappend)
31import Data.Monoid (mappend)
32#endif
32#endif
33import Data.Version (showVersion)
33import Data.Version (showVersion)
34−import Network.HTTP.Attoparsec (parseByteRanges)
35import qualified Network.HTTP.Types as H
34import qualified Network.HTTP.Types as H
36import Network.Wai
35import Network.Wai
37import qualified Network.Wai.Handler.Warp.Date as D
36import qualified Network.Wai.Handler.Warp.Date as D
@@ -39,6 +38,7 @@ import Network.Wai.Handler.Warp.Header
39import Network.Wai.Handler.Warp.Buffer (toBlazeBuffer)
38import Network.Wai.Handler.Warp.Buffer (toBlazeBuffer)
40import Network.Wai.Handler.Warp.IO (toBufIOWith)
39import Network.Wai.Handler.Warp.IO (toBufIOWith)
41import Network.Wai.Handler.Warp.ResponseHeader
40import Network.Wai.Handler.Warp.ResponseHeader
41+import Network.Wai.Handler.Warp.RequestHeader (parseByteRanges)
42import qualified Network.Wai.Handler.Warp.Timeout as T
42import qualified Network.Wai.Handler.Warp.Timeout as T
43import Network.Wai.Handler.Warp.Types
43import Network.Wai.Handler.Warp.Types
44import Network.Wai.Internal
44import Network.Wai.Internal
warp/warp.cabal+1−1
@@ -46,7 +46,7 @@ Library
46 , unix-compat >= 0.2
46 , unix-compat >= 0.2
47 , void
47 , void
48 , wai >= 2.0 && < 2.1
48 , wai >= 2.0 && < 2.1
49− , http-attoparsec
49+ , attoparsec >= 0.10.4.0 && < 0.12
50 if flag(network-bytestring)
50 if flag(network-bytestring)
51 Build-Depends: network >= 2.2.1.5 && < 2.2.3
51 Build-Depends: network >= 2.2.1.5 && < 2.2.3
52 , network-bytestring >= 0.1.3 && < 0.1.4
52 , network-bytestring >= 0.1.3 && < 0.1.4