git.iko.soy/typeable/servant
on master help sign in
servant-client-core: Redact Authorization header
ce3c68fRobert Hensing
servant-client-core/servant-client-core.cabal+1
@@ -96,6 +96,7 @@ test-suite spec
96 main-is: Spec.hs
96 main-is: Spec.hs
97 other-modules:
97 other-modules:
98 Servant.Client.Core.Internal.BaseUrlSpec
98 Servant.Client.Core.Internal.BaseUrlSpec
99+ Servant.Client.Core.RequestSpec
99
100
100 -- Dependencies inherited from the library. No need to specify bounds.
101 -- Dependencies inherited from the library. No need to specify bounds.
101 build-depends:
102 build-depends:
servant-client-core/src/Servant/Client/Core/Request.hs+25−1
@@ -64,8 +64,32 @@ data RequestF body path = Request
64 , requestHeaders :: Seq.Seq Header
64 , requestHeaders :: Seq.Seq Header
65 , requestHttpVersion :: HttpVersion
65 , requestHttpVersion :: HttpVersion
66 , requestMethod :: Method
66 , requestMethod :: Method
67− } deriving (Generic, Typeable, Eq, Show, Functor, Foldable, Traversable)
67+ } deriving (Generic, Typeable, Eq, Functor, Foldable, Traversable)
68
68
69+instance (Show a, Show b) =>
70+ Show (Servant.Client.Core.Request.RequestF a b) where
71+ showsPrec p req
72+ = showParen
73+ (p >= 11)
74+ ( showString "Request {requestPath = "
75+ . showsPrec 0 (requestPath req)
76+ . showString ", requestQueryString = "
77+ . showsPrec 0 (requestQueryString req)
78+ . showString ", requestBody = "
79+ . showsPrec 0 (requestBody req)
80+ . showString ", requestAccept = "
81+ . showsPrec 0 (requestAccept req)
82+ . showString ", requestHeaders = "
83+ . showsPrec 0 (redactSensitiveHeader <$> requestHeaders req))
84+ . showString ", requestHttpVersion = "
85+ . showsPrec 0 (requestHttpVersion req)
86+ . showString ", requestMethod = "
87+ . showsPrec 0 (requestMethod req)
88+ . showString "}"
89+ where
90+ redactSensitiveHeader :: Header -> Header
91+ redactSensitiveHeader ("Authorization", _) = ("Authorization", "<REDACTED>")
92+ redactSensitiveHeader h = h
69instance Bifunctor RequestF where bimap = bimapDefault
93instance Bifunctor RequestF where bimap = bimapDefault
70instance Bifoldable RequestF where bifoldMap = bifoldMapDefault
94instance Bifoldable RequestF where bifoldMap = bifoldMapDefault
71instance Bitraversable RequestF where
95instance Bitraversable RequestF where
servant-client-core/test/Servant/Client/Core/RequestSpec.hsnew file+19
@@ -0,0 +1,19 @@
1+{-# OPTIONS_GHC -fno-warn-orphans #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+module Servant.Client.Core.RequestSpec (spec) where
4+
5+
6+import Prelude ()
7+import Prelude.Compat
8+import Control.Monad
9+import Data.List (isInfixOf)
10+import Servant.Client.Core.Request
11+import Test.Hspec
12+
13+spec :: Spec
14+spec = do
15+ describe "Request" $ do
16+ describe "show" $ do
17+ it "redacts the authorization header" $ do
18+ let request = void $ defaultRequest { requestHeaders = pure ("authorization", "secret") }
19+ isInfixOf "secret" (show request) `shouldBe` False