12
12
from arangoasync .auth import Auth , JwtToken
13
13
from arangoasync .compression import CompressionManager , DefaultCompressionManager
14
14
from arangoasync .exceptions import (
15
+ AuthHeaderError ,
16
+ ClientConnectionAbortedError ,
15
17
ClientConnectionError ,
16
- ConnectionAbortedError ,
17
18
JWTRefreshError ,
18
19
ServerConnectionError ,
19
20
)
@@ -102,7 +103,7 @@ async def process_request(self, request: Request) -> Response:
102
103
self ._host_resolver .change_host ()
103
104
host_index = self ._host_resolver .get_host_index ()
104
105
105
- raise ConnectionAbortedError (
106
+ raise ClientConnectionAbortedError (
106
107
f"Can't connect to host(s) within limit ({ self ._host_resolver .max_tries } )"
107
108
)
108
109
@@ -226,6 +227,27 @@ def __init__(
226
227
if self ._token is None and self ._auth is None :
227
228
raise ValueError ("Either token or auth must be provided." )
228
229
230
+ @property
231
+ def token (self ) -> Optional [JwtToken ]:
232
+ """Get the JWT token.
233
+
234
+ Returns:
235
+ JwtToken | None: JWT token.
236
+ """
237
+ return self ._token
238
+
239
+ @token .setter
240
+ def token (self , token : Optional [JwtToken ]) -> None :
241
+ """Set the JWT token.
242
+
243
+ Args:
244
+ token (JwtToken | None): JWT token.
245
+ Setting it to None will cause the token to be automatically
246
+ refreshed on the next request, if auth information is provided.
247
+ """
248
+ self ._token = token
249
+ self ._auth_header = f"bearer { self ._token .token } " if self ._token else None
250
+
229
251
async def refresh_token (self ) -> None :
230
252
"""Refresh the JWT token.
231
253
@@ -248,7 +270,7 @@ async def refresh_token(self) -> None:
248
270
249
271
try :
250
272
resp = await self .process_request (request )
251
- except ConnectionAbortedError as e :
273
+ except ClientConnectionAbortedError as e :
252
274
raise JWTRefreshError (str (e )) from e
253
275
except ServerConnectionError as e :
254
276
raise JWTRefreshError (str (e )) from e
@@ -267,27 +289,6 @@ async def refresh_token(self) -> None:
267
289
"Failed to refresh the JWT token: got an expired token"
268
290
) from e
269
291
270
- @property
271
- def token (self ) -> Optional [JwtToken ]:
272
- """Get the JWT token.
273
-
274
- Returns:
275
- JwtToken | None: JWT token.
276
- """
277
- return self ._token
278
-
279
- @token .setter
280
- def token (self , token : Optional [JwtToken ]) -> None :
281
- """Set the JWT token.
282
-
283
- Args:
284
- token (JwtToken | None): JWT token.
285
- Setting it to None will cause the token to be automatically
286
- refreshed on the next request, if auth information is provided.
287
- """
288
- self ._token = token
289
- self ._auth_header = f"bearer { self ._token .token } " if self ._token else None
290
-
291
292
async def send_request (self , request : Request ) -> Response :
292
293
"""Send an HTTP request to the ArangoDB server.
293
294
@@ -303,6 +304,10 @@ async def send_request(self, request: Request) -> Response:
303
304
"""
304
305
if self ._auth_header is None :
305
306
await self .refresh_token ()
307
+
308
+ if self ._auth_header is None :
309
+ raise AuthHeaderError ("Failed to generate authorization header." )
310
+
306
311
request .headers ["authorization" ] = self ._auth_header
307
312
308
313
try :
0 commit comments