#452 - Ensuring that refresh_token is an isolated method to avoid duplication

- Storing old_params on self
- Reordering methods
- Removing 403 check on get_response
pull/446/merge
Augusto Monteiro 2017-01-27 23:56:11 -03:00
parent bfc47bc16a
commit d13b539644
1 changed files with 29 additions and 35 deletions

View File

@ -1,4 +1,4 @@
import copy from copy import copy
import requests import requests
from requests import HTTPError from requests import HTTPError
@ -19,44 +19,19 @@ class Api(object):
self.version = config_server.get("version") self.version = config_server.get("version")
self.identity = IdentityManager.get() self.identity = IdentityManager.get()
def request(self, params):
self.check_token()
self.build_path(params)
self.old_params = copy(params)
return self.send(params)
def check_token(self): def check_token(self):
if self.identity.refresh and self.identity.is_expired(): if self.identity.refresh and self.identity.is_expired():
self.identity = IdentityManager.load() self.identity = IdentityManager.load()
if self.identity.is_expired(): if self.identity.is_expired():
data = self.send({ self.refresh_token()
"path": "auth/token",
"headers": {
"Authorization": "Bearer " + self.identity.refresh
}
})
IdentityManager.save(data)
def send(self, params): def refresh_token(self):
old_params = copy.copy(params)
method = params.get("method", "GET")
headers = self.build_headers(params)
data = self.build_data(params)
json = self.build_json(params)
query = self.build_query(params)
url = self.build_url(params)
response = requests.request(method, url, headers=headers, params=query,
data=data, json=json)
return self.get_response(response, old_params)
def request(self, params):
self.check_token()
self.build_path(params)
return self.send(params)
def get_response(self, response, params):
data = self.get_data(response)
if 200 <= response.status_code < 300:
return data
elif (response.status_code == 403 or response.status_code == 401) and not response.url.endswith("auth/token"):
return self.refresh_token(params)
raise HTTPError(data, response=response)
def refresh_token(self, params):
data = self.send({ data = self.send({
"path": "auth/token", "path": "auth/token",
"headers": { "headers": {
@ -64,7 +39,26 @@ class Api(object):
} }
}) })
IdentityManager.save(data) IdentityManager.save(data)
return self.send(params)
def send(self, params):
method = params.get("method", "GET")
headers = self.build_headers(params)
data = self.build_data(params)
json = self.build_json(params)
query = self.build_query(params)
url = self.build_url(params)
response = requests.request(method, url, headers=headers, params=query,
data=data, json=json, timeout=(3.05, 15))
return self.get_response(response)
def get_response(self, response):
data = self.get_data(response)
if 200 <= response.status_code < 300:
return data
elif response.status_code == 401 and not response.url.endswith("auth/token"):
self.refresh_token()
return self.send(self.old_params)
raise HTTPError(data, response=response)
def get_data(self, response): def get_data(self, response):
try: try: