Use dict for HTTP status code → exception mapping.

This commit is contained in:
2016-07-08 12:31:21 +02:00
parent d76fcfdeba
commit 8565bf37b2
2 changed files with 41 additions and 28 deletions

View File

@@ -143,35 +143,15 @@ class Api(object):
"""Check HTTP response codes """Check HTTP response codes
""" """
status = response.status_code status = response.status_code
if status in (301, 302, 303, 307):
raise exceptions.Redirection(response, content) if 200 <= status <= 299:
elif 200 <= status <= 299:
return json.loads(content) if content else {} return json.loads(content) if content else {}
elif status == 400:
raise exceptions.BadRequest(response, content) exception = exceptions.exception_for_status(status)
elif status == 401: if exception:
raise exceptions.UnauthorizedAccess(response, content) raise exception(response, content)
elif status == 403:
raise exceptions.ForbiddenAccess(response, content) raise exceptions.ConnectionError(response, content, "Unknown response code: %s" % status)
elif status == 404:
raise exceptions.ResourceNotFound(response, content)
elif status == 405:
raise exceptions.MethodNotAllowed(response, content)
elif status == 409:
raise exceptions.ResourceConflict(response, content)
elif status == 410:
raise exceptions.ResourceGone(response, content)
elif status == 412:
raise exceptions.PreconditionFailed(response, content)
elif status == 422:
raise exceptions.ResourceInvalid(response, content)
elif 401 <= status <= 499:
raise exceptions.ClientError(response, content)
elif 500 <= status <= 599:
raise exceptions.ServerError(response, content)
else:
raise exceptions.ConnectionError(response,
content, "Unknown response code: #{response.code}")
def headers(self): def headers(self):
"""Default HTTP headers """Default HTTP headers

View File

@@ -101,3 +101,36 @@ class MethodNotAllowed(ClientError):
def allowed_methods(self): def allowed_methods(self):
return self.response['Allow'] return self.response['Allow']
_exception_map = {
301: Redirection,
302: Redirection,
303: Redirection,
307: Redirection,
400: BadRequest,
401: UnauthorizedAccess,
403: ForbiddenAccess,
404: ResourceNotFound,
405: MethodNotAllowed,
409: ResourceConflict,
410: ResourceGone,
412: PreconditionFailed,
422: ResourceInvalid,
}
def exception_for_status(status_code):
"""Returns the exception class for the given status code."""
try:
return _exception_map[status_code]
except KeyError:
pass
if 400 <= status_code <= 499:
return ClientError
elif 500 <= status_code <= 599:
return ServerError
return None