http-link-header 1.0.3.1 → 1.1.1
raw patch · 5 files changed
+150/−80 lines, 5 filesdep −bytestring-conversiondep ~QuickCheckdep ~attoparsecdep ~basenew-uploader
Dependencies removed: bytestring-conversion
Dependency ranges changed: QuickCheck, attoparsec, base, bytestring, criterion, directory, errors, hspec, hspec-attoparsec, http-api-data, network-uri, text, transformers
Files
- http-link-header.cabal +74/−57
- library/Network/HTTP/Link.hs +4/−10
- library/Network/HTTP/Link/Parser.hs +43/−10
- library/Network/HTTP/Link/Types.hs +28/−3
- test-suite/Network/HTTP/LinkSpec.hs +1/−0
http-link-header.cabal view
@@ -1,74 +1,91 @@-name: http-link-header-version: 1.0.3.1-synopsis: A parser and writer for the HTTP Link header as specified in RFC 5988 "Web Linking".-description: https://github.com/myfreeweb/http-link-header-category: Web-homepage: https://github.com/myfreeweb/http-link-header-author: Greg V-copyright: 2014-2018 Greg V <greg@unrelenting.technology>-maintainer: greg@unrelenting.technology-license: PublicDomain-license-file: UNLICENSE-build-type: Simple-cabal-version: >= 1.10-extra-source-files:- README.md-tested-with:- GHC == 8.4.3+cabal-version: 1.12+name: http-link-header+version: 1.1.1+license: PublicDomain+license-file: UNLICENSE+copyright: 2014-2020 Greg V <greg@unrelenting.technology>+maintainer: stevenjshuck@gmail.com+author: Greg V+tested-with: ghc ==8.4.3 ghc ==8.8.3+homepage: https://github.com/myfreeweb/http-link-header#readme+bug-reports: https://github.com/myfreeweb/http-link-header/issues+synopsis: A parser and writer for the HTTP Link header per RFC 5988+description:+ Please see the README on GitHub at <https://github.com/myfreeweb/http-link-header#readme> +category: Web+build-type: Simple+extra-source-files: README.md+ source-repository head- type: git- location: git://github.com/myfreeweb/http-link-header.git+ type: git+ location: https://github.com/myfreeweb/http-link-header library- build-depends:- base >= 4.3.0.0 && < 5- , text- , bytestring- , errors- , network-uri- , http-api-data- , attoparsec- , bytestring-conversion- default-language: Haskell2010 exposed-modules: Network.HTTP.Link- Network.HTTP.Link.Types Network.HTTP.Link.Parser+ Network.HTTP.Link.Types Network.HTTP.Link.Writer- ghc-options: -Wall- hs-source-dirs: library -test-suite tests- build-depends:- base >= 4.3.0.0 && < 5- , text- , http-link-header- , hspec- , QuickCheck- , hspec-attoparsec+ hs-source-dirs: library+ other-modules: Paths_http_link_header default-language: Haskell2010- ghc-options: -threaded -Wall- hs-source-dirs: test-suite- main-is: Spec.hs+ ghc-options: -Wall+ build-depends:+ attoparsec >=0.13.2.4 && <0.14,+ base >=4.3 && <5,+ bytestring >=0.10.10.0 && <0.11,+ errors >=2.3.0 && <2.4,+ http-api-data >=0.4.1.1 && <0.5,+ network-uri >=2.6.3.0 && <2.7,+ text >=1.2.4.0 && <1.3++test-suite tests+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ hs-source-dirs: test-suite other-modules: Network.HTTP.Link.ParserSpec Network.HTTP.Link.WriterSpec Network.HTTP.LinkSpec- type: exitcode-stdio-1.0+ Paths_http_link_header -benchmark benchmarks+ default-language: Haskell2010+ ghc-options: -threaded -Wall build-depends:- base >= 4.3.0.0 && < 5- , text- , http-link-header- , directory- , network-uri- , transformers- , criterion+ QuickCheck >=2.13.2 && <2.14,+ attoparsec >=0.13.2.4 && <0.14,+ base >=4.3 && <5,+ bytestring >=0.10.10.0 && <0.11,+ errors >=2.3.0 && <2.4,+ hspec >=2.7.2 && <2.8,+ hspec-attoparsec >=0.1.0.2 && <0.2,+ http-api-data >=0.4.1.1 && <0.5,+ http-link-header -any,+ network-uri >=2.6.3.0 && <2.7,+ text >=1.2.4.0 && <1.3++benchmark benchmarks+ type: exitcode-stdio-1.0+ main-is: Bench.hs+ hs-source-dirs: benchmark+ other-modules:+ ParserBench+ WriterBench+ Paths_http_link_header+ default-language: Haskell2010- hs-source-dirs: benchmark- main-is: Bench.hs- other-modules: ParserBench- WriterBench- type: exitcode-stdio-1.0+ ghc-options: -threaded -Wall+ build-depends:+ attoparsec >=0.13.2.4 && <0.14,+ base >=4.3 && <5,+ bytestring >=0.10.10.0 && <0.11,+ criterion >=1.5.6.2 && <1.6,+ directory >=1.3.6.0 && <1.4,+ errors >=2.3.0 && <2.4,+ http-api-data >=0.4.1.1 && <0.5,+ http-link-header -any,+ network-uri >=2.6.3.0 && <2.7,+ text >=1.2.4.0 && <1.3,+ transformers >=0.5.6.2 && <0.6
library/Network/HTTP/Link.hs view
@@ -8,22 +8,16 @@ , module Network.HTTP.Link.Parser ) where -import Data.ByteString.Conversion import Web.HttpApiData+import Data.Text.Encoding+import safe Network.HTTP.Link.Parser import safe Network.HTTP.Link.Types import safe Network.HTTP.Link.Writer-import safe Network.HTTP.Link.Parser -instance ToByteString [Link] where- builder = builder . writeLinkHeader--instance ToByteString Link where- builder = builder . writeLink- instance ToHttpApiData [Link] where toUrlPiece = toUrlPiece . writeLinkHeader- toHeader = toByteString'+ toHeader = encodeUtf8 . writeLinkHeader instance ToHttpApiData Link where toUrlPiece = toUrlPiece . writeLink- toHeader = toByteString'+ toHeader = encodeUtf8 . writeLink
library/Network/HTTP/Link/Parser.hs view
@@ -11,6 +11,18 @@ , parseLinkHeader , parseLinkHeaderBS' , parseLinkHeaderBS+ -- ** Generic links ('GLink')+ --+ -- | These functions are like the ones above, except they represent URLs as+ -- @('IsURI' uri) ⇒ uri@ values rather than concrete 'URI's from the+ -- network-uri package. Use these if you need access to the raw URLs+ -- (@uri ~ Text@) or some other representation of URLs.+ --+ -- @since 1.1.0+, parseGLinkHeader'+, parseGLinkHeader+, parseGLinkHeaderBS'+, parseGLinkHeaderBS ) where import Prelude hiding (takeWhile, take)@@ -71,35 +83,56 @@ v ← paramValue n' return (n', v) -link ∷ Parser Link-link = do+glink ∷ (IsURI uri) ⇒ Parser (GLink uri)+glink = do charWS '<' linkText ← takeWhile1 $ allConditions [(/= '>'), not . isSpace] charWS '>' params ← many' $ param skipSpace- case parseURIReference $ unpack linkText of- Just u → return $ Link u params- Nothing → fail "Couldn't parse the URI"+ case uriFromText linkText of+ Right u → return $ Link u params+ Left e → fail $ "Couldn't parse the URI " ++ show linkText ++ if e == "" then "" else ": " ++ e +glinkHeader ∷ (IsURI uri) ⇒ Parser [GLink uri]+glinkHeader = glink `sepBy'` (char ',')+ -- | The Attoparsec parser for the Link header. linkHeader ∷ Parser [Link]-linkHeader = link `sepBy'` (char ',')+linkHeader = glinkHeader +-- | Parses a GLink header, returns an Either, where Left is the Attoparsec+-- error string (probably not a useful one).+parseGLinkHeader' ∷ (IsURI uri) ⇒ Text → Either String [GLink uri]+parseGLinkHeader' = parseOnly glinkHeader++-- | Parses a GLink header, returns a Maybe.+parseGLinkHeader ∷ (IsURI uri) ⇒ Text → Maybe [GLink uri]+parseGLinkHeader = hush . parseGLinkHeader'++-- | Parses a GLink header, returns an Either, where Left is the Attoparsec+-- error string (probably not a useful one).+parseGLinkHeaderBS' ∷ (IsURI uri) ⇒ ByteString → Either String [GLink uri]+parseGLinkHeaderBS' = parseGLinkHeader' . decodeUtf8++-- | Parses a GLink header, returns a Maybe.+parseGLinkHeaderBS ∷ (IsURI uri) ⇒ ByteString → Maybe [GLink uri]+parseGLinkHeaderBS = parseGLinkHeader . decodeUtf8+ -- | Parses a Link header, returns an Either, where Left is the Attoparsec -- error string (probably not a useful one). parseLinkHeader' ∷ Text → Either String [Link]-parseLinkHeader' = parseOnly linkHeader+parseLinkHeader' = parseGLinkHeader' -- | Parses a Link header, returns a Maybe. parseLinkHeader ∷ Text → Maybe [Link]-parseLinkHeader = hush . parseLinkHeader'+parseLinkHeader = parseGLinkHeader -- | Parses a Link header, returns an Either, where Left is the Attoparsec -- error string (probably not a useful one). parseLinkHeaderBS' ∷ ByteString → Either String [Link]-parseLinkHeaderBS' = parseLinkHeader' . decodeUtf8+parseLinkHeaderBS' = parseGLinkHeaderBS' -- | Parses a Link header, returns a Maybe. parseLinkHeaderBS ∷ ByteString → Maybe [Link]-parseLinkHeaderBS = parseLinkHeader . decodeUtf8+parseLinkHeaderBS = parseGLinkHeaderBS
library/Network/HTTP/Link/Types.hs view
@@ -10,9 +10,34 @@ data LinkParam = Rel | Anchor | Rev | Hreflang | Media | Title | Title' | ContentType | Other Text deriving (Eq, Show) --- | A single link.-data Link = Link URI [(LinkParam, Text)]- deriving (Eq, Show)+-- | A single link containing some representation of a URL.+--+-- @since 1.1.0+data GLink uri = Link uri [(LinkParam, Text)]+ deriving (Eq, Show)++-- | Types that can represent URLs.+--+-- For example, to parse links containing [@Text.URI.URI@ from the @modern-uri@ package](https://hackage.haskell.org/package/modern-uri-0.3.2.0/docs/Text-URI.html#t:URI), simply define:+--+-- @+-- instance IsURI Modern.URI where+-- uriFromText = left displayException . mkURI+-- @+--+-- @since 1.1.0+class IsURI uri where+ uriFromText ∷ Text → Either String uri++instance IsURI URI where+ uriFromText = maybe (Left "") Right . parseURIReference . unpack++instance IsURI Text where+ uriFromText = Right++-- | A single link containing a network-uri URI. Most of this library is+-- specialized to this case.+type Link = GLink URI -- | Extracts the URI from the link. href ∷ Link → URI
test-suite/Network/HTTP/LinkSpec.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE OverloadedStrings, UnicodeSyntax, CPP #-}+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Network.HTTP.LinkSpec where