@@ -49,8 +49,9 @@ import GHC.TypeLits
49import Network.HTTP.Client (HttpException, RequestBody (..))
49import Network.HTTP.Client (HttpException, RequestBody (..))
50import qualified Network.HTTP.Client as Client
50import qualified Network.HTTP.Client as Client
51import Network.HTTP.Media hiding (Accept)
51import Network.HTTP.Media hiding (Accept)
52−import Network.HTTP.Types
52+import Network.HTTP.Types hiding (Header)
53−import Servant.API hiding (Header)
53+import qualified Network.HTTP.Types as HTTP
54import Servant.Utils.Links
55import Servant.Utils.Links
56data AltJSON = AltJSON
57data AltJSON = AltJSON
@@ -66,10 +67,13 @@ instance ToText AltMedia where
66 toText = const "media"
67 toText = const "media"
68newtype AuthKey = AuthKey Text
69newtype AuthKey = AuthKey Text
69− deriving (Eq, Ord, Show, Read, Generic, Data, Typeable, ToText, FromText)
70+ deriving (Eq, Ord, Show, Read, Generic, Data, Typeable, ToText)
71newtype OAuthToken = OAuthToken Text
72newtype OAuthToken = OAuthToken Text
72− deriving (Eq, Ord, Show, Read, Generic, Data, Typeable, ToText, FromText)
73+ deriving (Eq, Ord, Show, Read, Generic, Data, Typeable)
75+instance ToText OAuthToken where
76+ toText (OAuthToken t) = "Bearer " <> t
74class GoogleAuth a where
78class GoogleAuth a where
75 _AuthKey :: Traversal' a AuthKey
79 _AuthKey :: Traversal' a AuthKey
@@ -118,7 +122,7 @@ data SerializeError = SerializeError'
118 -- , _serializeMessage :: String
122 -- , _serializeMessage :: String
119 } deriving (Eq, Show, Typeable)
123 } deriving (Eq, Show, Typeable)
121−data ServiceError = ServiceError' !Status !MediaType [Header] LBS.ByteString
125+data ServiceError = ServiceError' !Status !MediaType [HTTP.Header] LBS.ByteString
122 -- _serviceAbbrev :: !Abbrev
126 -- _serviceAbbrev :: !Abbrev
123 -- , _serviceStatus :: !Status
127 -- , _serviceStatus :: !Status
124 -- , _serviceHeaders :: [Header]
128 -- , _serviceHeaders :: [Header]
@@ -166,6 +170,7 @@ data RequestBuilder = RequestBuilder
166 , _rqBasePath :: ByteString
170 , _rqBasePath :: ByteString
167 , _rqPath :: Builder
171 , _rqPath :: Builder
168 , _rqQuery :: DList (Text, Maybe Text)
172 , _rqQuery :: DList (Text, Maybe Text)
173+ , _rqHeaders :: DList (Text, Text)
169 , _rqBody :: Maybe (MediaType, Stream)
174 , _rqBody :: Maybe (MediaType, Stream)
@@ -179,6 +184,7 @@ defaultRequest h p = RequestBuilder
179 , _rqBasePath = p
184 , _rqBasePath = p
180 , _rqPath = mempty
185 , _rqPath = mempty
181 , _rqQuery = mempty
186 , _rqQuery = mempty
187+ , _rqHeaders = mempty
182 , _rqBody = Nothing
188 , _rqBody = Nothing
@@ -191,6 +197,10 @@ appendPaths rq = appendPath rq . foldMap (mappend "/" . buildText)
191appendQuery :: RequestBuilder -> Text -> Maybe Text -> RequestBuilder
197appendQuery :: RequestBuilder -> Text -> Maybe Text -> RequestBuilder
192appendQuery rq k v = rq { _rqQuery = DList.snoc (_rqQuery rq) (k, v) }
198appendQuery rq k v = rq { _rqQuery = DList.snoc (_rqQuery rq) (k, v) }
200+appendHeader :: RequestBuilder -> Text -> Maybe Text -> RequestBuilder
201+appendHeader rq _ Nothing = rq
202+appendHeader rq k (Just v) = rq { _rqHeaders = DList.snoc (_rqHeaders rq) (k, v) }
194setStream :: RequestBuilder -> MediaType -> Stream -> RequestBuilder
204setStream :: RequestBuilder -> MediaType -> Stream -> RequestBuilder
195setStream rq c x = rq { _rqBody = Just (c, x) }
205setStream rq c x = rq { _rqBody = Just (c, x) }
@@ -396,6 +406,20 @@ instance ( KnownSymbol s
397 k = textSymbol (Proxy :: Proxy s)
407 k = textSymbol (Proxy :: Proxy s)
409+instance ( KnownSymbol s
412+ ) => GoogleClient (Header s a :> fn) where
413+ type Fn (Header s a :> fn) = Maybe a -> Fn fn
415+ clientBuild Proxy rq mx = clientBuild (Proxy :: Proxy fn) $
418+ Just x -> appendHeader rq k v
420+ k = textSymbol (Proxy :: Proxy s)
399instance ( ToStream c a
423instance ( ToStream c a
400 , GoogleClient fn
424 , GoogleClient fn
401 ) => GoogleClient (ReqBody (c ': cs) a :> fn) where
425 ) => GoogleClient (ReqBody (c ': cs) a :> fn) where