Handle and log document-download-api request errors

Catches the requests exception for document-download-api calls, logs
a warning and returns a matching response code and message.

Connection errors to document download result in 503 response to the
user.
This commit is contained in:
Alexey Bezhan
2018-04-09 16:09:54 +01:00
parent f2e163dc43
commit b097a16a86
3 changed files with 67 additions and 16 deletions

View File

@@ -2,6 +2,25 @@ import base64
import requests
from flask import current_app
class DocumentDownloadError(Exception):
def __init__(self, message, status_code):
self.message = message
self.status_code = status_code
@classmethod
def from_exception(cls, e):
try:
message = e.response.json()['error']
status_code = e.response.status_code
except (TypeError, ValueError, AttributeError, KeyError):
message = 'connection error'
status_code = 503
return cls(message, status_code)
class DocumentDownloadClient:
@@ -13,15 +32,24 @@ class DocumentDownloadClient:
return "{}/services/{}/documents".format(self.api_host, service_id)
def upload_document(self, service_id, file_contents):
response = requests.post(
self.get_upload_url(service_id),
headers={
'Authorization': "Bearer {}".format(self.auth_token),
},
files={
'document': base64.b64decode(file_contents)
}
)
response.raise_for_status()
try:
response = requests.post(
self.get_upload_url(service_id),
headers={
'Authorization': "Bearer {}".format(self.auth_token),
},
files={
'document': base64.b64decode(file_contents)
}
)
response.raise_for_status()
except requests.RequestException as e:
error = DocumentDownloadError.from_exception(e)
current_app.logger.warning(
'Document download request failed with error: {}'.format(error.message)
)
raise error
return response.json()['document']['url']