From 4abd86680163318957f6ebecfa29fc7f1580e46a Mon Sep 17 00:00:00 2001 From: Germano Guerrini Date: Fri, 16 Sep 2022 16:47:10 +0200 Subject: [PATCH] Fixed token renewal on forbidden responses --- hda/api.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/hda/api.py b/hda/api.py index 1470a53..38fbc83 100644 --- a/hda/api.py +++ b/hda/api.py @@ -319,6 +319,9 @@ def is_token_expired(): return self._token + def invalidate_token(self): + self._token_creation_time = None + def get_token(self): session = requests.Session() session.auth = (self.user, self.password) @@ -337,9 +340,12 @@ def session(self): session = requests.Session() session.mount("ftp://", FTPAdapter(self)) self._session = session + self._attach_auth() + return self._session + + def _attach_auth(self): self._session.headers = {"Authorization": self.token} self.debug("Token is %s", self.token) - return self._session def info(self, *args, **kwargs): if self.info_callback: @@ -366,7 +372,7 @@ def debug(self, *args, **kwargs): self.logger.debug(*args, **kwargs) def robust(self, call): - def retriable(code, reason): + def retriable(code): if code in [ requests.codes.internal_server_error, @@ -375,6 +381,7 @@ def retriable(code, reason): requests.codes.gateway_timeout, requests.codes.too_many_requests, requests.codes.request_timeout, + requests.codes.forbidden, ]: return True @@ -395,12 +402,13 @@ def wrapped(*args, **kwargs): ) if r is not None: - if not retriable(r.status_code, r.reason): + if not retriable(r.status_code): return r if r.status_code == requests.codes.forbidden: - # Try to renew the token next time - self._token_creation_time = None + self.debug("Trying to renew token") + self.invalidate_token() + self._attach_auth() self.warning( "Recovering from HTTP error [%s %s], attemps %s of %s", @@ -443,8 +451,10 @@ def get(self, *args): if self.debug: self.session # Force login + full = self.full_url(*args) self.debug("===> GET %s", full) + r = self.robust(self.session.get)(full, timeout=self.timeout) r.raise_for_status() result = r.json()