"""Exceptions for HTTP status code over 400 (4xx client errors and 5xx server
errors) from the `http module <https://docs.python.org/3/library/http.html>`_.
=========== =============================== ====================================== ====================================================================================================================================================== ==================
Status code Name Exception class Description RFC Link
=========== =============================== ====================================== ====================================================================================================================================================== ==================
400 Bad Request :class:`BadRequest` Bad request syntax or unsupported method. :rfc:`7231#6.5.1`
401 Unauthorized :class:`Unauthorized` No permission -- see authorization schemes. :rfc:`7235#3.1`
402 Payment Required :class:`PaymentRequired` No payment -- see charging schemes. :rfc:`7231#6.5.2`
403 Forbidden :class:`Forbidden` Request forbidden -- authorization will not help. :rfc:`7231#6.5.3`
404 Not Found :class:`NotFound` Nothing matches the given URI. :rfc:`7231#6.5.4`
405 Method Not Allowed :class:`MethodNotAllowed` Specified method is invalid for this resource. :rfc:`7231#6.5.5`
406 Not Acceptable :class:`NotAcceptable` URI not available in preferred format. :rfc:`7231#6.5.6`
407 Proxy Authentication Required :class:`ProxyAuthenticationRequired` You must authenticate with this proxy before proceeding. :rfc:`7235#3.2`
408 Request Timeout :class:`RequestTimeout` Request timed out; try again later. :rfc:`7231#6.5.7`
409 Conflict :class:`Conflict` Request conflict. :rfc:`7231#6.5.8`
410 Gone :class:`Gone` URI no longer exists and has been permanently removed. :rfc:`7231#6.5.9`
411 Length Required :class:`LengthRequired` Client must specify Content-Length header. :rfc:`7231#6.5.10`
412 Precondition Failed :class:`PreconditionFailed` Precondition in headers is false. :rfc:`7232#4.2`
413 Request Entity Too Large :class:`RequestEntityTooLarge` Entity is too large. :rfc:`7231#6.5.11`
414 Request-URI Too Long :class:`RequestURITooLong` URI is too long. :rfc:`7231#6.5.12`
415 Unsupported Media Type :class:`UnsupportedMediaType` Entity body in unsupported format. :rfc:`7231#6.5.13`
416 Requested Range Not Satisfiable :class:`RequestedRangeNotSatisfiable` Cannot satisfy request range. :rfc:`7233#4.4`
417 Expectation Failed :class:`ExpectationFailed` Expect condition could not be satisfied. :rfc:`7231#6.5.14`
418 I'm a Teapot :class:`IMATeapot` Server refuses to brew coffee because it is a teapot (1998 April Fools'). :rfc:`2324#2.3.2`
421 Misdirected Request :class:`MisdirectedRequest` Server is not able to produce a response. :rfc:`7540#9.1.2`
422 Unprocessable Entity :class:`UnprocessableEntity` Server understands the content but was unable to process the contained instructions.. :rfc:`4918#11.2`
423 Locked :class:`Locked` Source or destination resource of a method is locked. :rfc:`4918#11.3`
424 Failed Dependency :class:`FailedDependency` Request method could not be performed on the resource because the requested action depended on another action that failed. :rfc:`4918#11.4`
425 Too Early :class:`TooEarly` Server is unwilling to risk processing a request that might be replayed. :rfc:`8470#5.2`
426 Upgrade Required :class:`UpgradeRequired` Server refuses to perform the request using the current protocol but might be willing to do so after the client upgrades to a different protocol. :rfc:`7231#6.5.15`
428 Precondition Required :class:`PreconditionRequired` Origin server requires the request to be conditional. :rfc:`6585#3`
429 Too Many Requests :class:`TooManyRequests` User has sent too many requests in a given amount of time ("rate limiting"). :rfc:`6585#4`
431 Request Header Fields Too Large :class:`RequestHeaderFieldsTooLarge` Server is unwilling to process the request because its header fields are too large. :rfc:`6585#5`
451 Unavailable For Legal Reasons :class:`UnavailableForLegalReasons` Server is denying access to the resource as a consequence of a legal demand. :rfc:`7725#3`
500 Internal Server Error :class:`InternalServerError` Server got itself in trouble. :rfc:`7231#6.6.1`
501 Not Implemented :class:`NotImplemented` Server does not support this operation. :rfc:`7231#6.6.2`
502 Bad Gateway :class:`BadGateway` Invalid responses from another server/proxy. :rfc:`7231#6.6.3`
503 Service Unavailable :class:`ServiceUnavailable` Server cannot process the request due to a high load. :rfc:`7231#6.6.4`
504 Gateway Timeout :class:`GatewayTimeout` Gateway server did not receive a timely response. :rfc:`7231#6.6.5`
505 HTTP Version Not Supported :class:`HTTPVersionNotSupported` Cannot fulfill request. :rfc:`7231#6.6.6`
506 Variant Also Negotiates :class:`VariantAlsoNegotiates` Server configuration error in which the chosen variant is itself configured to engage in content negotiation, so is not a proper negotiation endpoint. :rfc:`2295#8.1`
507 Insufficient Storage :class:`InsufficientStorage` Method could not be performed on the resource because the server is unable to store the representation needed to successfully complete the request. :rfc:`4918#11.5`
508 Loop Detected :class:`LoopDetected` Server terminated an operation because it encountered an infinite loop while processing a request. :rfc:`5842#7.2`
510 Not Extended :class:`NotExtended` Server terminated an operation because it encountered an infinite loop while processing a request. :rfc:`2774#7`
511 Network Authentication Required :class:`NetworkAuthenticationRequired` Client needs to authenticate to gain network access. :rfc:`6585#6`
=========== =============================== ====================================== ====================================================================================================================================================== ==================
"""
import http
[docs]class HTTPException(Exception):
"""Base class for HTTP exceptions.
Attributes
----------
status_code: :class:`int`
HTTP status code.
name: :class:`str`
Name of the HTTP exception.
description: :class:`str`
Description of the HTTP exception.
"""
def __init__(
self, status_code: int, name: str = None, description: str = None
):
if name is None:
name = http.HTTPStatus(status_code).phrase
if description is None:
description = http.HTTPStatus(status_code).description
self.status_code = status_code
self.name = name
self.description = description
def __repr__(self) -> str:
return (
"HTTP Exception: {0.status_code} {0.name}{1}{0.description}".format(
self, ": " if self.description else ""
)
)
[docs]class BadRequest(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(400, name=name, description=description)
[docs]class Unauthorized(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(401, name=name, description=description)
[docs]class PaymentRequired(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(402, name=name, description=description)
[docs]class Forbidden(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(403, name=name, description=description)
[docs]class NotFound(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(404, name=name, description=description)
[docs]class MethodNotAllowed(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(405, name=name, description=description)
[docs]class NotAcceptable(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(406, name=name, description=description)
[docs]class ProxyAuthenticationRequired(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(407, name=name, description=description)
[docs]class RequestTimeout(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(408, name=name, description=description)
[docs]class Conflict(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(409, name=name, description=description)
[docs]class Gone(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(410, name=name, description=description)
[docs]class LengthRequired(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(411, name=name, description=description)
[docs]class PreconditionFailed(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(412, name=name, description=description)
[docs]class RequestedRangeNotSatisfiable(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(416, name=name, description=description)
[docs]class ExpectationFailed(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(417, name=name, description=description)
[docs]class IMATeapot(HTTPException):
def __init__(self, name: str = None, description: str = None):
if name is None:
name = "I'm a Teapot" # For py < 3.9
if description is None:
description = (
"Server refuses to brew coffee because it is a teapot."
)
super().__init__(418, name=name, description=description)
[docs]class MisdirectedRequest(HTTPException):
def __init__(self, name: str = None, description: str = None):
if name is None:
name = "Misdirected Request" # For py < 3.7
if description is None:
description = "Server is not able to produce a response"
super().__init__(421, name=name, description=description)
[docs]class UnprocessableEntity(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(422, name=name, description=description)
[docs]class Locked(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(423, name=name, description=description)
[docs]class FailedDependency(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(424, name=name, description=description)
[docs]class TooEarly(HTTPException):
def __init__(self, name: str = None, description: str = None):
if name is None:
name = "Too Early" # For py < 3.9
if description is None:
description = "Server is unwilling to risk processing a request that might be replayed"
super().__init__(425, name=name, description=description)
[docs]class UpgradeRequired(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(426, name=name, description=description)
[docs]class PreconditionRequired(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(428, name=name, description=description)
[docs]class TooManyRequests(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(429, name=name, description=description)
[docs]class UnavailableForLegalReasons(HTTPException):
def __init__(self, name: str = None, description: str = None):
if name is None:
name = "Unavailable For Legal Reasons" # For py < 3.8
if description is None:
description = "The server is denying access to the resource as a consequence of a legal demand"
super().__init__(451, name=name, description=description)
[docs]class InternalServerError(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(500, name=name, description=description)
[docs]class NotImplemented(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(501, name=name, description=description)
[docs]class BadGateway(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(502, name=name, description=description)
[docs]class ServiceUnavailable(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(503, name=name, description=description)
[docs]class GatewayTimeout(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(504, name=name, description=description)
[docs]class HTTPVersionNotSupported(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(505, name=name, description=description)
[docs]class VariantAlsoNegotiates(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(506, name=name, description=description)
[docs]class InsufficientStorage(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(507, name=name, description=description)
[docs]class LoopDetected(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(508, name=name, description=description)
[docs]class NotExtended(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(510, name=name, description=description)
[docs]class NetworkAuthenticationRequired(HTTPException):
def __init__(self, name: str = None, description: str = None):
super().__init__(511, name=name, description=description)