From d05da71f09be08131d29a2c17f613a4bd71faea2 Mon Sep 17 00:00:00 2001 From: Giorgio Marinelli Date: Tue, 1 Mar 2022 15:22:25 +0100 Subject: [PATCH] Export encoding function for a query parameter value (#1549) --- servant-client-core/src/Servant/Client/Core.hs | 1 + .../src/Servant/Client/Core/HasClient.hs | 11 +++-------- .../src/Servant/Client/Core/Request.hs | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/servant-client-core/src/Servant/Client/Core.hs b/servant-client-core/src/Servant/Client/Core.hs index cfebbb5f..138ea9a0 100644 --- a/servant-client-core/src/Servant/Client/Core.hs +++ b/servant-client-core/src/Servant/Client/Core.hs @@ -59,6 +59,7 @@ module Servant.Client.Core , appendToPath , setRequestBodyLBS , setRequestBody + , encodeQueryParamValue ) where import Servant.Client.Core.Auth import Servant.Client.Core.BaseUrl diff --git a/servant-client-core/src/Servant/Client/Core/HasClient.hs b/servant-client-core/src/Servant/Client/Core/HasClient.hs index 9b26c089..ef03cb4e 100644 --- a/servant-client-core/src/Servant/Client/Core/HasClient.hs +++ b/servant-client-core/src/Servant/Client/Core/HasClient.hs @@ -33,9 +33,7 @@ import Control.Arrow import Control.Monad (unless) import qualified Data.ByteString as BS -import Data.ByteString.Builder - (toLazyByteString) -import qualified Data.ByteString.Lazy as BL +import qualified Data.ByteString.Lazy as BL import Data.Either (partitionEithers) import Data.Constraint (Dict(..)) @@ -571,7 +569,7 @@ instance (KnownSymbol sym, ToHttpApiData a, HasClient m api, SBoolI (FoldRequire (Proxy :: Proxy mods) add (maybe req add) mparam where add :: a -> Request - add param = appendToQueryString pname (Just $ encodeQueryParam param) req + add param = appendToQueryString pname (Just $ encodeQueryParamValue param) req pname :: Text pname = pack $ symbolVal (Proxy :: Proxy sym) @@ -579,9 +577,6 @@ instance (KnownSymbol sym, ToHttpApiData a, HasClient m api, SBoolI (FoldRequire hoistClientMonad pm _ f cl = \arg -> hoistClientMonad pm (Proxy :: Proxy api) f (cl arg) -encodeQueryParam :: ToHttpApiData a => a -> BS.ByteString -encodeQueryParam = BL.toStrict . toLazyByteString . toEncodedUrlPiece - -- | If you use a 'QueryParams' in one of your endpoints in your API, -- the corresponding querying function will automatically take -- an additional argument, a list of values of the type specified @@ -623,7 +618,7 @@ instance (KnownSymbol sym, ToHttpApiData a, HasClient m api) ) where pname = pack $ symbolVal (Proxy :: Proxy sym) - paramlist' = map (Just . encodeQueryParam) paramlist + paramlist' = map (Just . encodeQueryParamValue) paramlist hoistClientMonad pm _ f cl = \as -> hoistClientMonad pm (Proxy :: Proxy api) f (cl as) diff --git a/servant-client-core/src/Servant/Client/Core/Request.hs b/servant-client-core/src/Servant/Client/Core/Request.hs index 2733f65c..babe878b 100644 --- a/servant-client-core/src/Servant/Client/Core/Request.hs +++ b/servant-client-core/src/Servant/Client/Core/Request.hs @@ -17,6 +17,7 @@ module Servant.Client.Core.Request ( addHeader, appendToPath, appendToQueryString, + encodeQueryParamValue, setRequestBody, setRequestBodyLBS, ) where @@ -142,18 +143,29 @@ defaultRequest = Request , requestMethod = methodGet } +-- | Append extra path to the request being constructed. +-- appendToPath :: Text -> Request -> Request appendToPath p req = req { requestPath = requestPath req <> "/" <> toEncodedUrlPiece p } -appendToQueryString :: Text -- ^ param name - -> Maybe BS.ByteString -- ^ param value +-- | Append a query parameter to the request being constructed. +-- +appendToQueryString :: Text -- ^ query param name + -> Maybe BS.ByteString -- ^ query param value -> Request -> Request appendToQueryString pname pvalue req = req { requestQueryString = requestQueryString req Seq.|> (encodeUtf8 pname, pvalue)} +-- | Encode a query parameter value. +-- +encodeQueryParamValue :: ToHttpApiData a => a -> BS.ByteString +encodeQueryParamValue = LBS.toStrict . Builder.toLazyByteString . toEncodedUrlPiece + +-- | Add header to the request being constructed. +-- addHeader :: ToHttpApiData a => HeaderName -> a -> Request -> Request addHeader name val req = req { requestHeaders = requestHeaders req Seq.|> (name, toHeader val)}