diff --git a/servant-client/servant-client.cabal b/servant-client/servant-client.cabal index c908be71..e7b16f39 100644 --- a/servant-client/servant-client.cabal +++ b/servant-client/servant-client.cabal @@ -33,6 +33,7 @@ library base >=4.7 && <5 , aeson , attoparsec + , base64-bytestring , bytestring , exceptions , http-client @@ -65,7 +66,6 @@ test-suite spec , transformers , transformers-compat , aeson - , base64-bytestring , bytestring , deepseq , hspec == 2.* diff --git a/servant-client/src/Servant/Client/Authentication.hs b/servant-client/src/Servant/Client/Authentication.hs index 1d7d43d9..083fb0ed 100644 --- a/servant-client/src/Servant/Client/Authentication.hs +++ b/servant-client/src/Servant/Client/Authentication.hs @@ -1,12 +1,25 @@ +{-# LANGUAGE OverloadedStrings #-} + -- | Authentication for clients module Servant.Client.Authentication ( AuthenticateRequest ( authReq ) ) where -import Servant.Common.Req (Req) +import Data.ByteString.Base64 (encode) +import Data.Monoid ((<>)) +import Data.Text.Encoding (decodeUtf8) +import Servant.API.Authentication (BasicAuth(BasicAuth)) +import Servant.Common.Req (addHeader, Req) -- | Class to represent the ability to authenticate a 'Request' -- object. For example, we may add special headers to the 'Request'. class AuthenticateRequest a where authReq :: a -> Req -> Req + + +instance AuthenticateRequest (BasicAuth realm) where + authReq (BasicAuth user pass) req = + let authText = decodeUtf8 ("Basic " <> encode (user <> ":" <> pass)) in + addHeader "Authorization" authText req + diff --git a/servant-client/test/Servant/ClientSpec.hs b/servant-client/test/Servant/ClientSpec.hs index 2b291fe3..50387e43 100644 --- a/servant-client/test/Servant/ClientSpec.hs +++ b/servant-client/test/Servant/ClientSpec.hs @@ -20,14 +20,12 @@ import Control.Concurrent import Control.Exception import Control.Monad.Trans.Except import Data.Aeson -import qualified Data.ByteString.Base64 as B64 import Data.ByteString.Lazy (ByteString) import Data.Char import Data.Foldable (forM_) import Data.Monoid import Data.Proxy import qualified Data.Text as T -import qualified Data.Text.Encoding as TE import GHC.Generics import qualified Network.HTTP.Client as C import Network.HTTP.Media @@ -44,8 +42,7 @@ import Test.QuickCheck import Servant.API import Servant.API.Authentication import Servant.Client -import qualified Servant.Common.Req as SCR -import Servant.Client.Authentication (AuthenticateRequest(authReq)) +import Servant.Client.Authentication() import Servant.Server import Servant.Server.Internal.Authentication @@ -113,11 +110,6 @@ basicAuthCheck (BasicAuth user pass) = if user == "servant" && pass == "server" then return (Just $ Person "servant" 17) else return Nothing -instance AuthenticateRequest (BasicAuth realm) where - authReq (BasicAuth user pass) req = - let authText = TE.decodeUtf8 ("Basic " <> B64.encode (user <> ":" <> pass)) in - SCR.addHeader "Authorization" authText req - api :: Proxy Api api = Proxy