diff --git a/doc/api/errors.rst b/doc/api/errors.rst index f65da21..4e4e9d8 100644 --- a/doc/api/errors.rst +++ b/doc/api/errors.rst @@ -37,4 +37,5 @@ Predefined Errors HTTPMethodNotAllowed, HTTPNotAcceptable, HTTPConflict, HTTPLengthRequired, HTTPPreconditionFailed, HTTPUnsupportedMediaType, HTTPRangeNotSatisfiable, HTTPUnprocessableEntity, HTTPTooManyRequests, - HTTPInternalServerError, HTTPBadGateway, HTTPServiceUnavailable + HTTPUnavailableForLegalReasons, HTTPInternalServerError, + HTTPBadGateway, HTTPServiceUnavailable diff --git a/doc/api/status.rst b/doc/api/status.rst index 0aa6c68..b7effb3 100644 --- a/doc/api/status.rst +++ b/doc/api/status.rst @@ -100,6 +100,7 @@ string objects that must be created when preparing responses. HTTP_PRECONDITION_REQUIRED = HTTP_428 HTTP_TOO_MANY_REQUESTS = HTTP_429 HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = HTTP_431 + HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = HTTP_451 HTTP_400 = '400 Bad Request' HTTP_401 = '401 Unauthorized' # <-- Really means "unauthenticated" @@ -125,6 +126,7 @@ string objects that must be created when preparing responses. HTTP_428 = '428 Precondition Required' HTTP_429 = '429 Too Many Requests' HTTP_431 = '431 Request Header Fields Too Large' + HTTP_451 = '451 Unavailable For Legal Reasons' 5xx Server Error ---------------- diff --git a/falcon/errors.py b/falcon/errors.py index f6c7ec1..4519947 100644 --- a/falcon/errors.py +++ b/falcon/errors.py @@ -361,6 +361,26 @@ class HTTPTooManyRequests(HTTPError): **kwargs) +class HTTPUnavailableForLegalReasons(OptionalRepresentation, HTTPError): + """451 Unavailable For Legal Reasons. + + This status code indicates that the server is denying access to the + resource as a consequence of a legal demand. + + See also: + https://datatracker.ietf.org/doc/draft-ietf-httpbis-legally-restricted-status/ + + Args: + title (str): Error title (e.g., 'Legal reason: '). + kwargs (optional): Same as for ``HTTPError``. + + """ + + def __init__(self, title, **kwargs): + super(HTTPUnavailableForLegalReasons, self).__init__(status.HTTP_451, + title, **kwargs) + + class HTTPInternalServerError(HTTPError): """500 Internal Server Error. diff --git a/falcon/status_codes.py b/falcon/status_codes.py index c27c602..d3fee76 100644 --- a/falcon/status_codes.py +++ b/falcon/status_codes.py @@ -100,6 +100,8 @@ HTTP_429 = '429 Too Many Requests' HTTP_TOO_MANY_REQUESTS = HTTP_429 HTTP_431 = '431 Request Header Fields Too Large' HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = HTTP_431 +HTTP_451 = '451 Unavailable For Legal Reasons' +HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = HTTP_451 HTTP_500 = '500 Internal Server Error' HTTP_INTERNAL_SERVER_ERROR = HTTP_500 diff --git a/tests/test_httperror.py b/tests/test_httperror.py index 0a8578c..9c2a4df 100644 --- a/tests/test_httperror.py +++ b/tests/test_httperror.py @@ -773,5 +773,7 @@ class TestHTTPError(testing.TestBase): self._misc_test(falcon.HTTPUnsupportedMediaType, falcon.HTTP_415, needs_title=False) self._misc_test(falcon.HTTPUnprocessableEntity, falcon.HTTP_422) + self._misc_test(falcon.HTTPUnavailableForLegalReasons, falcon.HTTP_451, + needs_title=False) self._misc_test(falcon.HTTPInternalServerError, falcon.HTTP_500) self._misc_test(falcon.HTTPBadGateway, falcon.HTTP_502)