http-attoparsec-0.1.0/0000755000000000000000000000000012154675033013026 5ustar0000000000000000http-attoparsec-0.1.0/README.md0000644000000000000000000000015612154675033014307 0ustar0000000000000000http-attoparsec =============== Attoparsec parsers for [http-types](https://github.com/aristidb/http-types). http-attoparsec-0.1.0/LICENSE0000644000000000000000000000277112154675033014042 0ustar0000000000000000Copyright (c) 2013, Tero Laitinen All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Aristid Breitkreuz nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. http-attoparsec-0.1.0/http-attoparsec.cabal0000644000000000000000000000425112154675033017136 0ustar0000000000000000-- http-types.cabal auto-generated by cabal init. For additional -- options, see -- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr. -- The name of the package. Name: http-attoparsec -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented. Version: 0.1.0 -- A short (one-line) description of the package. Synopsis: Attoparsec parsers for http-types. -- A longer description of the package. Description: Attoparsec parsers for http-types. -- URL for the project homepage or repository. Homepage: https://github.com/tlaitinen/http-attoparsec -- The license under which the package is released. License: BSD3 -- The file containing the license text. License-file: LICENSE -- The package author(s). Author: Tero Laitinen -- An email address to which users can send suggestions, bug reports, -- and patches. Maintainer: tol@iki.fi -- A copyright notice. Copyright: (C) 2013 Tero Laitinen Category: Network, Web Build-type: Simple -- Extra files to be distributed with the package, such as examples or -- a README. Extra-source-files: README.md -- Constraint on the version of Cabal needed to build this package. Cabal-version: >=1.8 Source-repository this type: git location: https://github.com/tlaitinen/http-attoparsec.git tag: 0.1.0 Source-repository head type: git location: https://github.com/tlaitinen/http-attoparsec.git Library -- Modules exported by the library. Exposed-modules: Network.HTTP.Attoparsec -- GHC Options. GHC-Options: -Wall -- Packages needed in order to build this package. Build-depends: base >= 4 && < 5, bytestring >=0.9.1.5 && <0.11, attoparsec >= 0.10.4.0 && < 0.11, http-types >= 0.8.0 && < 0.9 -- Modules not exported by this package. -- Other-modules: -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source. http-attoparsec-0.1.0/Setup.hs0000644000000000000000000000005612154675033014463 0ustar0000000000000000import Distribution.Simple main = defaultMain http-attoparsec-0.1.0/Network/0000755000000000000000000000000012154675033014457 5ustar0000000000000000http-attoparsec-0.1.0/Network/HTTP/0000755000000000000000000000000012154675033015236 5ustar0000000000000000http-attoparsec-0.1.0/Network/HTTP/Attoparsec.hs0000644000000000000000000000237512154675033017706 0ustar0000000000000000{-# LANGUAGE OverloadedStrings #-} module Network.HTTP.Attoparsec ( byteRangesParser, parseByteRanges ) where import Network.HTTP.Types.Header import qualified Data.ByteString as B import qualified Data.Attoparsec.ByteString.Char8 as A8 import Control.Applicative ((<|>), (<$>)) byteRangesParser :: A8.Parser ByteRanges byteRangesParser = do _ <- A8.string "bytes=" br <- range rest <- maybeMoreRanges return $ br:rest where range = rangeFromTo <|> rangeSuffix rangeFromTo = do f <- A8.decimal _ <- A8.char '-' mt <- Just <$> A8.decimal <|> return Nothing return $ case mt of Just t -> ByteRangeFromTo f t Nothing -> ByteRangeFrom f rangeSuffix = do _ <- A8.char '-' s <- A8.decimal return $ ByteRangeSuffix s maybeMoreRanges = moreRanges <|> return [] moreRanges = do _ <- A8.char ',' r <- range rest <- maybeMoreRanges return $ r:rest parseByteRanges :: B.ByteString -> Maybe ByteRanges parseByteRanges bs = case A8.parseOnly byteRangesParser bs of Left _ -> Nothing Right br -> Just br