polysemy-http 0.1.0.0 → 0.2.0.0
raw patch · 8 files changed
+72/−34 lines, 8 filesdep ~lensdep ~template-haskellPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: lens, template-haskell
API changes (from Hackage documentation)
- Polysemy.Http.Prelude: [getDown] :: Down a -> a
+ Polysemy.Http: ChunkFailed :: Text -> HttpError
+ Polysemy.Http: Internal :: Text -> HttpError
+ Polysemy.Http: [name] :: Header -> HeaderName
+ Polysemy.Http: [unBody] :: Body -> LByteString
+ Polysemy.Http: [unHeaderName] :: HeaderName -> Text
+ Polysemy.Http: [unHeaderValue] :: HeaderValue -> Text
+ Polysemy.Http: [unHost] :: Host -> Text
+ Polysemy.Http: [unPath] :: Path -> Text
+ Polysemy.Http: [unPort] :: Port -> Int
+ Polysemy.Http: [unQueryKey] :: QueryKey -> Text
+ Polysemy.Http: [unQueryValue] :: QueryValue -> Text
+ Polysemy.Http: [unTls] :: Tls -> Bool
+ Polysemy.Http: [value] :: Header -> HeaderValue
+ Polysemy.Http: data HttpError
+ Polysemy.Http.Data.Header: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Header.Header
+ Polysemy.Http.Data.Header: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Header.HeaderName
+ Polysemy.Http.Data.Header: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Header.HeaderValue
+ Polysemy.Http.Data.Header: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Header.Header
+ Polysemy.Http.Data.Header: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Header.HeaderName
+ Polysemy.Http.Data.Header: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Header.HeaderValue
+ Polysemy.Http.Data.Header: instance GHC.Generics.Generic Polysemy.Http.Data.Header.Header
+ Polysemy.Http.Data.Header: instance GHC.Generics.Generic Polysemy.Http.Data.Header.HeaderName
+ Polysemy.Http.Data.Header: instance GHC.Generics.Generic Polysemy.Http.Data.Header.HeaderValue
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.Host
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.Method
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.Path
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.Port
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.QueryKey
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.QueryValue
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.FromJSON.FromJSON Polysemy.Http.Data.Request.Tls
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.Host
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.Method
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.Path
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.Port
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.QueryKey
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.QueryValue
+ Polysemy.Http.Data.Request: instance Data.Aeson.Types.ToJSON.ToJSON Polysemy.Http.Data.Request.Tls
+ Polysemy.Http.Data.Request: instance GHC.Base.Monoid Polysemy.Http.Data.Request.Path
+ Polysemy.Http.Data.Request: instance GHC.Base.Semigroup Polysemy.Http.Data.Request.Path
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.Body
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.Host
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.Path
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.Port
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.QueryKey
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.QueryValue
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.Request
+ Polysemy.Http.Data.Request: instance GHC.Generics.Generic Polysemy.Http.Data.Request.Tls
+ Polysemy.Http.Data.Response: Status :: Int -> ByteString -> Status
+ Polysemy.Http.Data.Response: data Status
- Polysemy.Http: interpretHttpStrict :: Members [Embed IO, Error HttpError] r => [Response LByteString] -> [ByteString] -> InterpreterFor (Http Int) r
+ Polysemy.Http: interpretHttpStrict :: Member (Embed IO) r => [Response LByteString] -> [ByteString] -> InterpreterFor (Http Int) r
- Polysemy.Http.Data.Manager: get :: forall r_aoqo. MemberWithError Manager r_aoqo => Sem r_aoqo Manager
+ Polysemy.Http.Data.Manager: get :: forall r_aD7u. MemberWithError Manager r_aD7u => Sem r_aD7u Manager
- Polysemy.Http.Data.Request: body :: HasRequest c_ayWe => Lens' c_ayWe Body
+ Polysemy.Http.Data.Request: body :: HasRequest c_aUQd => Lens' c_aUQd Body
- Polysemy.Http.Data.Request: class HasRequest c_ayWe
+ Polysemy.Http.Data.Request: class HasRequest c_aUQd
- Polysemy.Http.Data.Request: headers :: HasRequest c_ayWe => Lens' c_ayWe [(HeaderName, HeaderValue)]
+ Polysemy.Http.Data.Request: headers :: HasRequest c_aUQd => Lens' c_aUQd [(HeaderName, HeaderValue)]
- Polysemy.Http.Data.Request: host :: HasRequest c_ayWe => Lens' c_ayWe Host
+ Polysemy.Http.Data.Request: host :: HasRequest c_aUQd => Lens' c_aUQd Host
- Polysemy.Http.Data.Request: method :: HasRequest c_ayWe => Lens' c_ayWe Method
+ Polysemy.Http.Data.Request: method :: HasRequest c_aUQd => Lens' c_aUQd Method
- Polysemy.Http.Data.Request: path :: HasRequest c_ayWe => Lens' c_ayWe Path
+ Polysemy.Http.Data.Request: path :: HasRequest c_aUQd => Lens' c_aUQd Path
- Polysemy.Http.Data.Request: port :: HasRequest c_ayWe => Lens' c_ayWe (Maybe Port)
+ Polysemy.Http.Data.Request: port :: HasRequest c_aUQd => Lens' c_aUQd (Maybe Port)
- Polysemy.Http.Data.Request: query :: HasRequest c_ayWe => Lens' c_ayWe [(QueryKey, Maybe QueryValue)]
+ Polysemy.Http.Data.Request: query :: HasRequest c_aUQd => Lens' c_aUQd [(QueryKey, Maybe QueryValue)]
- Polysemy.Http.Data.Request: request :: HasRequest c_ayWe => Lens' c_ayWe Request
+ Polysemy.Http.Data.Request: request :: HasRequest c_aUQd => Lens' c_aUQd Request
- Polysemy.Http.Data.Request: tls :: HasRequest c_ayWe => Lens' c_ayWe Tls
+ Polysemy.Http.Data.Request: tls :: HasRequest c_aUQd => Lens' c_aUQd Tls
- Polysemy.Http.Prelude: coerce :: forall (k :: RuntimeRep) (a :: TYPE k) (b :: TYPE k). Coercible a b => a -> b
+ Polysemy.Http.Prelude: coerce :: Coercible a b => a -> b
- Polysemy.Http.Prelude: infix 4 >=
+ Polysemy.Http.Prelude: infix 4 <
- Polysemy.Http.Prelude: seq :: forall (r :: RuntimeRep) a (b :: TYPE r). a -> b -> b
+ Polysemy.Http.Prelude: seq :: a -> b -> b
- Polysemy.Http.Strict: interpretHttpStrict :: Members [Embed IO, Error HttpError] r => [Response LByteString] -> [ByteString] -> InterpreterFor (Http Int) r
+ Polysemy.Http.Strict: interpretHttpStrict :: Member (Embed IO) r => [Response LByteString] -> [ByteString] -> InterpreterFor (Http Int) r
- Polysemy.Http.Strict: interpretHttpStrictWithState :: Members [Embed IO, State [ByteString], State [Response LByteString], Error HttpError] r => InterpreterFor (Http Int) r
+ Polysemy.Http.Strict: interpretHttpStrictWithState :: Members [State [ByteString], State [Response LByteString], Embed IO] r => InterpreterFor (Http Int) r
Files
- lib/Polysemy/Http.hs +10/−8
- lib/Polysemy/Http/Data/Header.hs +11/−3
- lib/Polysemy/Http/Data/HttpError.hs +1/−0
- lib/Polysemy/Http/Data/Request.hs +29/−9
- lib/Polysemy/Http/Data/Response.hs +5/−2
- lib/Polysemy/Http/Native.hs +1/−1
- lib/Polysemy/Http/Strict.hs +8/−4
- polysemy-http.cabal +7/−7
lib/Polysemy/Http.hs view
@@ -9,6 +9,7 @@ module Polysemy.Http.Data.Response, module Polysemy.Http.Data.Header, module Polysemy.Http.Request,+ HttpError(..), -- * Streaming module Polysemy.Http.Http, module Polysemy.Http.Data.StreamEvent,@@ -49,20 +50,21 @@ encode, encodeStrict, )-import Polysemy.Http.Data.Header (Header(Header), HeaderName(HeaderName), HeaderValue(HeaderValue))+import Polysemy.Http.Data.Header (Header(..), HeaderName(..), HeaderValue(..)) import Polysemy.Http.Data.Http (Http, request, stream)+import Polysemy.Http.Data.HttpError (HttpError(..)) import Polysemy.Http.Data.Log (Log) import Polysemy.Http.Data.Manager (Manager) import Polysemy.Http.Data.Request (- Body(Body),- Host(Host),+ Body(..),+ Host(..), Method(..),- Path(Path),- Port(Port),- QueryKey(QueryKey),- QueryValue(QueryValue),+ Path(..),+ Port(..),+ QueryKey(..),+ QueryValue(..), Request(..),- Tls(Tls),+ Tls(..), ) import Polysemy.Http.Data.Response ( Response(..),
lib/Polysemy/Http/Data/Header.hs view
@@ -1,21 +1,29 @@+{-# OPTIONS_GHC -fclear-plugins #-}+ module Polysemy.Http.Data.Header where -- |The name of a header. newtype HeaderName = HeaderName { unHeaderName :: Text }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) deriving newtype (IsString) +defaultJson ''HeaderName+ -- |The value of a header. newtype HeaderValue = HeaderValue { unHeaderValue :: Text }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) deriving newtype (IsString) +defaultJson ''HeaderValue+ -- |An HTTP header. data Header = Header { name :: HeaderName, value :: HeaderValue }- deriving (Eq, Show)+ deriving (Eq, Show, Generic)++defaultJson ''Header
lib/Polysemy/Http/Data/HttpError.hs view
@@ -1,5 +1,6 @@ module Polysemy.Http.Data.HttpError where +-- |Indicates a critical error caused by an exception in the http-client backend. data HttpError = ChunkFailed Text |
lib/Polysemy/Http/Data/Request.hs view
@@ -1,3 +1,5 @@+{-# OPTIONS_GHC -fclear-plugins #-}+ module Polysemy.Http.Data.Request where import Control.Lens (makeClassy)@@ -28,6 +30,8 @@ Custom Text deriving (Eq, Show) +defaultJson ''Method+ instance IsString Method where fromString = \case "GET" -> Get@@ -59,41 +63,57 @@ -- |Request host name. newtype Host = Host { unHost :: Text }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) deriving newtype (IsString) +defaultJson ''Host+ -- |Request port. newtype Port = Port { unPort :: Int }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) +defaultJson ''Port+ -- |A flag that indicates whether a request should use TLS. newtype Tls = Tls { unTls :: Bool }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) +defaultJson ''Tls+ -- |Rrequest path. newtype Path = Path { unPath :: Text }- deriving (Eq, Show)- deriving newtype (IsString)+ deriving (Eq, Show, Generic)+ deriving newtype (IsString, Monoid) +instance Semigroup Path where+ Path l <> Path r =+ Path (Text.dropWhileEnd ('/' ==) l <> "/" <> Text.dropWhile ('/' ==) r)++defaultJson ''Path+ -- |The key of a query parameter. newtype QueryKey = QueryKey { unQueryKey :: Text }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) deriving newtype (IsString) +defaultJson ''QueryKey+ -- |The value of a query parameter. newtype QueryValue = QueryValue { unQueryValue :: Text }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) deriving newtype (IsString) +defaultJson ''QueryValue+ -- |Request body, using 'LByteString' because it is what 'Aeson.encode' produces. newtype Body = Body { unBody :: LByteString }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) deriving newtype (IsString) -- |HTTP request parameters, used by 'Polysemy.Http.Data.Http'.@@ -108,6 +128,6 @@ _query :: [(QueryKey, Maybe QueryValue)], _body :: Body }- deriving (Eq, Show)+ deriving (Eq, Show, Generic) makeClassy ''Request
lib/Polysemy/Http/Data/Response.hs view
@@ -1,8 +1,11 @@-module Polysemy.Http.Data.Response where+module Polysemy.Http.Data.Response (+ module Polysemy.Http.Data.Response,+ Status(Status),+) where import Network.HTTP.Client (BodyReader) import Network.HTTP.Types (- Status,+ Status(Status), statusIsClientError, statusIsInformational, statusIsRedirection,
lib/Polysemy/Http/Native.hs view
@@ -123,7 +123,7 @@ Members [Embed IO, Log, Resource, Manager] r => InterpreterFor (Http BodyReader) r interpretHttpNativeWith =- interpretH $ \case+ interpretH \case Http.Request request -> do Log.debug $ [qt|http request: #{request}|] manager <- Manager.get
lib/Polysemy/Http/Strict.hs view
@@ -35,10 +35,10 @@ ] interpretHttpStrictWithState ::- Members [Embed IO, State [ByteString], State [Response LByteString], Error HttpError] r =>+ Members [State [ByteString], State [Response LByteString], Embed IO] r => InterpreterFor (Http Int) r interpretHttpStrictWithState =- interpretH $ \case+ interpretH \case Http.Request _ -> liftT . takeResponse =<< raise get Http.Stream _ handler -> do@@ -53,10 +53,14 @@ -- The first parameter is a list of 'Response'. When a request is made, one response is popped of the head and returned. -- If the list is exhausted, a 502 response is returned. interpretHttpStrict ::- Members [Embed IO, Error HttpError] r =>+ Member (Embed IO) r => [Response LByteString] -> [ByteString] -> InterpreterFor (Http Int) r interpretHttpStrict responses chunks =- evalState chunks . evalState responses . interpretHttpStrictWithState . raiseUnder . raiseUnder+ evalState chunks .+ evalState responses .+ interpretHttpStrictWithState .+ raiseUnder .+ raiseUnder {-# INLINE interpretHttpStrict #-}
polysemy-http.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: polysemy-http-version: 0.1.0.0+version: 0.2.0.0 synopsis: Polysemy effect for http-client description: Please see the README on Github at <https://github.com/tek/polysemy-http> category: Network@@ -65,13 +65,13 @@ , http-client-tls >=0.3.5 , http-conduit >=2.3.7 , http-types >=0.12.3- , lens >=4.19.2+ , lens >=4 , mono-traversable >=1.0.15 , polysemy >=1.3.0 , polysemy-plugin >=0.2.5 , relude >=0.7.0 , string-interpolate >=0.2.1- , template-haskell >=2.16.0+ , template-haskell >=2.14.0 , text >=1.2.3 if impl(ghcjs) else@@ -110,7 +110,7 @@ , http-client-tls >=0.3.5 , http-conduit >=2.3.7 , http-types >=0.12.3- , lens >=4.19.2+ , lens >=4 , mono-traversable >=1.0.15 , network , polysemy >=1.3.0@@ -123,7 +123,7 @@ , string-interpolate >=0.2.1 , tasty , tasty-hedgehog- , template-haskell >=2.16.0+ , template-haskell >=2.14.0 , text >=1.2.3 , warp mixins:@@ -165,7 +165,7 @@ , http-client-tls >=0.3.5 , http-conduit >=2.3.7 , http-types >=0.12.3- , lens >=4.19.2+ , lens >=4 , mono-traversable >=1.0.15 , polysemy >=1.3.0 , polysemy-http@@ -174,7 +174,7 @@ , string-interpolate >=0.2.1 , tasty , tasty-hedgehog- , template-haskell >=2.16.0+ , template-haskell >=2.14.0 , text >=1.2.3 mixins: polysemy-http hiding (Prelude)