mirror of
https://github.com/GSA/notifications-api.git
synced 2026-02-01 23:55:58 -05:00
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:
@@ -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']
|
||||
|
||||
Reference in New Issue
Block a user