on master help sign in
Drop attoparsec dep
20fa372Michael Snoyman
warp/Network/Wai/Handler/Warp/RequestHeader.hs+27−33
@@ -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 ((<|>), (<$>))
24-- $setup
22-- $setup
25-- >>> :set -XOverloadedStrings
23-- >>> :set -XOverloadedStrings
26
24
@@ -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')
157
155
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−
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
160+ ranges (r:) bs3
161+ where
162+ range bs2 =
163+ case stripPrefix "-" bs2 of
164+ Just bs3 -> do
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)
173+ ranges front bs3 =
174+ case stripPrefix "," bs3 of
175+ Nothing -> Just (front [])
176+ Just bs4 -> do
177+ (r, bs5) <- range bs4
178+ ranges (front . (r:)) bs5
179+
180+ stripPrefix x y
181+ | x `S.isPrefixOf` y = Just (S.drop (S.length x) y)
182+ | otherwise = Nothing
warp/warp.cabal−2
@@ -46,7 +46,6 @@ 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− , attoparsec >= 0.10.4.0 && < 0.12
50 if flag(network-bytestring)
49 if flag(network-bytestring)
51 Build-Depends: network >= 2.2.1.5 && < 2.2.3
50 Build-Depends: network >= 2.2.1.5 && < 2.2.3
52 , network-bytestring >= 0.1.3 && < 0.1.4
51 , network-bytestring >= 0.1.3 && < 0.1.4
@@ -133,7 +132,6 @@ Test-Suite spec
133 , hspec >= 1.3
132 , hspec >= 1.3
134 , time
133 , time
135 , old-locale
134 , old-locale
136− , attoparsec
137
135
138 if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)
136 if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)
139 Cpp-Options: -DSENDFILEFD
137 Cpp-Options: -DSENDFILEFD