@@ -116,6 +116,7 @@ async def ping(self) -> int:
116
116
ServerConnectionError: If the response status code is not successful.
117
117
"""
118
118
request = Request (method = Method .GET , endpoint = "/_api/collection" )
119
+ request .headers = {"abde" : "fghi" }
119
120
resp = await self .send_request (request )
120
121
return resp .status_code
121
122
@@ -190,8 +191,7 @@ async def send_request(self, request: Request) -> Response:
190
191
class JwtConnection (BaseConnection ):
191
192
"""Connection to a specific ArangoDB database, using JWT authentication.
192
193
193
- Allows for basic authentication to be used (username and password),
194
- together with JWT.
194
+ Providing login information (username and password), allows to refresh the JWT.
195
195
196
196
Args:
197
197
sessions (list): List of client sessions.
@@ -221,7 +221,7 @@ def __init__(
221
221
self ._expire_leeway : int = 0
222
222
self ._token : Optional [JwtToken ] = None
223
223
self ._auth_header : Optional [str ] = None
224
- self .set_token ( token )
224
+ self .token = token
225
225
226
226
if self ._token is None and self ._auth is None :
227
227
raise ValueError ("Either token or auth must be provided." )
@@ -261,21 +261,31 @@ async def refresh_token(self) -> None:
261
261
262
262
token = json .loads (resp .raw_body )
263
263
try :
264
- self .set_token ( JwtToken (token ["jwt" ]) )
264
+ self .token = JwtToken (token ["jwt" ])
265
265
except jwt .ExpiredSignatureError as e :
266
266
raise JWTRefreshError (
267
267
"Failed to refresh the JWT token: got an expired token"
268
268
) from e
269
269
270
- def set_token (self , value : Optional [JwtToken ]) -> None :
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 :
271
281
"""Set the JWT token.
272
282
273
283
Args:
274
- value (JwtToken | None): JWT token.
284
+ token (JwtToken | None): JWT token.
275
285
Setting it to None will cause the token to be automatically
276
286
refreshed on the next request, if auth information is provided.
277
287
"""
278
- self ._token = value
288
+ self ._token = token
279
289
self ._auth_header = f"bearer { self ._token .token } " if self ._token else None
280
290
281
291
async def send_request (self , request : Request ) -> Response :
@@ -291,20 +301,20 @@ async def send_request(self, request: Request) -> Response:
291
301
ArangoClientError: If an error occurred from the client side.
292
302
ArangoServerError: If an error occurred from the server side.
293
303
"""
294
- if self ._auth_header is not None :
295
- request .headers ["authorization" ] = self ._auth_header
296
- else :
304
+ if self ._auth_header is None :
297
305
await self .refresh_token ()
306
+ request .headers ["authorization" ] = self ._auth_header
298
307
299
308
try :
300
309
resp = await self .process_request (request )
301
310
if (
302
- resp .status_code == 401
311
+ resp .status_code == 401 # Unauthorized
303
312
and self ._token is not None
304
313
and self ._token .needs_refresh (self ._expire_leeway )
305
314
):
306
315
await self .refresh_token ()
307
- return await self .process_request (request )
308
- except ServerConnectionError as e :
316
+ return await self .process_request (request ) # Retry with new token
317
+ except ServerConnectionError :
309
318
# TODO modify after refactoring of prep_response, so we can inspect response
310
- raise e
319
+ await self .refresh_token ()
320
+ return await self .process_request (request ) # Retry with new token
0 commit comments