| | import warnings |
| | from typing import Any, Dict, Iterable, List, Optional, Set |
| |
|
| | from yarl import URL |
| |
|
| | from .typedefs import LooseHeaders, StrOrURL |
| | from .web_response import Response |
| |
|
| | __all__ = ( |
| | "HTTPException", |
| | "HTTPError", |
| | "HTTPRedirection", |
| | "HTTPSuccessful", |
| | "HTTPOk", |
| | "HTTPCreated", |
| | "HTTPAccepted", |
| | "HTTPNonAuthoritativeInformation", |
| | "HTTPNoContent", |
| | "HTTPResetContent", |
| | "HTTPPartialContent", |
| | "HTTPMove", |
| | "HTTPMultipleChoices", |
| | "HTTPMovedPermanently", |
| | "HTTPFound", |
| | "HTTPSeeOther", |
| | "HTTPNotModified", |
| | "HTTPUseProxy", |
| | "HTTPTemporaryRedirect", |
| | "HTTPPermanentRedirect", |
| | "HTTPClientError", |
| | "HTTPBadRequest", |
| | "HTTPUnauthorized", |
| | "HTTPPaymentRequired", |
| | "HTTPForbidden", |
| | "HTTPNotFound", |
| | "HTTPMethodNotAllowed", |
| | "HTTPNotAcceptable", |
| | "HTTPProxyAuthenticationRequired", |
| | "HTTPRequestTimeout", |
| | "HTTPConflict", |
| | "HTTPGone", |
| | "HTTPLengthRequired", |
| | "HTTPPreconditionFailed", |
| | "HTTPRequestEntityTooLarge", |
| | "HTTPRequestURITooLong", |
| | "HTTPUnsupportedMediaType", |
| | "HTTPRequestRangeNotSatisfiable", |
| | "HTTPExpectationFailed", |
| | "HTTPMisdirectedRequest", |
| | "HTTPUnprocessableEntity", |
| | "HTTPFailedDependency", |
| | "HTTPUpgradeRequired", |
| | "HTTPPreconditionRequired", |
| | "HTTPTooManyRequests", |
| | "HTTPRequestHeaderFieldsTooLarge", |
| | "HTTPUnavailableForLegalReasons", |
| | "HTTPServerError", |
| | "HTTPInternalServerError", |
| | "HTTPNotImplemented", |
| | "HTTPBadGateway", |
| | "HTTPServiceUnavailable", |
| | "HTTPGatewayTimeout", |
| | "HTTPVersionNotSupported", |
| | "HTTPVariantAlsoNegotiates", |
| | "HTTPInsufficientStorage", |
| | "HTTPNotExtended", |
| | "HTTPNetworkAuthenticationRequired", |
| | ) |
| |
|
| |
|
| | class NotAppKeyWarning(UserWarning): |
| | """Warning when not using AppKey in Application.""" |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| |
|
| | class HTTPException(Response, Exception): |
| |
|
| | |
| | |
| |
|
| | status_code = -1 |
| | empty_body = False |
| |
|
| | __http_exception__ = True |
| |
|
| | def __init__( |
| | self, |
| | *, |
| | headers: Optional[LooseHeaders] = None, |
| | reason: Optional[str] = None, |
| | body: Any = None, |
| | text: Optional[str] = None, |
| | content_type: Optional[str] = None, |
| | ) -> None: |
| | if body is not None: |
| | warnings.warn( |
| | "body argument is deprecated for http web exceptions", |
| | DeprecationWarning, |
| | ) |
| | Response.__init__( |
| | self, |
| | status=self.status_code, |
| | headers=headers, |
| | reason=reason, |
| | body=body, |
| | text=text, |
| | content_type=content_type, |
| | ) |
| | Exception.__init__(self, self.reason) |
| | if self.body is None and not self.empty_body: |
| | self.text = f"{self.status}: {self.reason}" |
| |
|
| | def __bool__(self) -> bool: |
| | return True |
| |
|
| |
|
| | class HTTPError(HTTPException): |
| | """Base class for exceptions with status codes in the 400s and 500s.""" |
| |
|
| |
|
| | class HTTPRedirection(HTTPException): |
| | """Base class for exceptions with status codes in the 300s.""" |
| |
|
| |
|
| | class HTTPSuccessful(HTTPException): |
| | """Base class for exceptions with status codes in the 200s.""" |
| |
|
| |
|
| | class HTTPOk(HTTPSuccessful): |
| | status_code = 200 |
| |
|
| |
|
| | class HTTPCreated(HTTPSuccessful): |
| | status_code = 201 |
| |
|
| |
|
| | class HTTPAccepted(HTTPSuccessful): |
| | status_code = 202 |
| |
|
| |
|
| | class HTTPNonAuthoritativeInformation(HTTPSuccessful): |
| | status_code = 203 |
| |
|
| |
|
| | class HTTPNoContent(HTTPSuccessful): |
| | status_code = 204 |
| | empty_body = True |
| |
|
| |
|
| | class HTTPResetContent(HTTPSuccessful): |
| | status_code = 205 |
| | empty_body = True |
| |
|
| |
|
| | class HTTPPartialContent(HTTPSuccessful): |
| | status_code = 206 |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| |
|
| | class HTTPMove(HTTPRedirection): |
| | def __init__( |
| | self, |
| | location: StrOrURL, |
| | *, |
| | headers: Optional[LooseHeaders] = None, |
| | reason: Optional[str] = None, |
| | body: Any = None, |
| | text: Optional[str] = None, |
| | content_type: Optional[str] = None, |
| | ) -> None: |
| | if not location: |
| | raise ValueError("HTTP redirects need a location to redirect to.") |
| | super().__init__( |
| | headers=headers, |
| | reason=reason, |
| | body=body, |
| | text=text, |
| | content_type=content_type, |
| | ) |
| | self.headers["Location"] = str(URL(location)) |
| | self.location = location |
| |
|
| |
|
| | class HTTPMultipleChoices(HTTPMove): |
| | status_code = 300 |
| |
|
| |
|
| | class HTTPMovedPermanently(HTTPMove): |
| | status_code = 301 |
| |
|
| |
|
| | class HTTPFound(HTTPMove): |
| | status_code = 302 |
| |
|
| |
|
| | |
| | |
| | class HTTPSeeOther(HTTPMove): |
| | status_code = 303 |
| |
|
| |
|
| | class HTTPNotModified(HTTPRedirection): |
| | |
| | status_code = 304 |
| | empty_body = True |
| |
|
| |
|
| | class HTTPUseProxy(HTTPMove): |
| | |
| | status_code = 305 |
| |
|
| |
|
| | class HTTPTemporaryRedirect(HTTPMove): |
| | status_code = 307 |
| |
|
| |
|
| | class HTTPPermanentRedirect(HTTPMove): |
| | status_code = 308 |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| |
|
| | class HTTPClientError(HTTPError): |
| | pass |
| |
|
| |
|
| | class HTTPBadRequest(HTTPClientError): |
| | status_code = 400 |
| |
|
| |
|
| | class HTTPUnauthorized(HTTPClientError): |
| | status_code = 401 |
| |
|
| |
|
| | class HTTPPaymentRequired(HTTPClientError): |
| | status_code = 402 |
| |
|
| |
|
| | class HTTPForbidden(HTTPClientError): |
| | status_code = 403 |
| |
|
| |
|
| | class HTTPNotFound(HTTPClientError): |
| | status_code = 404 |
| |
|
| |
|
| | class HTTPMethodNotAllowed(HTTPClientError): |
| | status_code = 405 |
| |
|
| | def __init__( |
| | self, |
| | method: str, |
| | allowed_methods: Iterable[str], |
| | *, |
| | headers: Optional[LooseHeaders] = None, |
| | reason: Optional[str] = None, |
| | body: Any = None, |
| | text: Optional[str] = None, |
| | content_type: Optional[str] = None, |
| | ) -> None: |
| | allow = ",".join(sorted(allowed_methods)) |
| | super().__init__( |
| | headers=headers, |
| | reason=reason, |
| | body=body, |
| | text=text, |
| | content_type=content_type, |
| | ) |
| | self.headers["Allow"] = allow |
| | self.allowed_methods: Set[str] = set(allowed_methods) |
| | self.method = method.upper() |
| |
|
| |
|
| | class HTTPNotAcceptable(HTTPClientError): |
| | status_code = 406 |
| |
|
| |
|
| | class HTTPProxyAuthenticationRequired(HTTPClientError): |
| | status_code = 407 |
| |
|
| |
|
| | class HTTPRequestTimeout(HTTPClientError): |
| | status_code = 408 |
| |
|
| |
|
| | class HTTPConflict(HTTPClientError): |
| | status_code = 409 |
| |
|
| |
|
| | class HTTPGone(HTTPClientError): |
| | status_code = 410 |
| |
|
| |
|
| | class HTTPLengthRequired(HTTPClientError): |
| | status_code = 411 |
| |
|
| |
|
| | class HTTPPreconditionFailed(HTTPClientError): |
| | status_code = 412 |
| |
|
| |
|
| | class HTTPRequestEntityTooLarge(HTTPClientError): |
| | status_code = 413 |
| |
|
| | def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: |
| | kwargs.setdefault( |
| | "text", |
| | "Maximum request body size {} exceeded, " |
| | "actual body size {}".format(max_size, actual_size), |
| | ) |
| | super().__init__(**kwargs) |
| |
|
| |
|
| | class HTTPRequestURITooLong(HTTPClientError): |
| | status_code = 414 |
| |
|
| |
|
| | class HTTPUnsupportedMediaType(HTTPClientError): |
| | status_code = 415 |
| |
|
| |
|
| | class HTTPRequestRangeNotSatisfiable(HTTPClientError): |
| | status_code = 416 |
| |
|
| |
|
| | class HTTPExpectationFailed(HTTPClientError): |
| | status_code = 417 |
| |
|
| |
|
| | class HTTPMisdirectedRequest(HTTPClientError): |
| | status_code = 421 |
| |
|
| |
|
| | class HTTPUnprocessableEntity(HTTPClientError): |
| | status_code = 422 |
| |
|
| |
|
| | class HTTPFailedDependency(HTTPClientError): |
| | status_code = 424 |
| |
|
| |
|
| | class HTTPUpgradeRequired(HTTPClientError): |
| | status_code = 426 |
| |
|
| |
|
| | class HTTPPreconditionRequired(HTTPClientError): |
| | status_code = 428 |
| |
|
| |
|
| | class HTTPTooManyRequests(HTTPClientError): |
| | status_code = 429 |
| |
|
| |
|
| | class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): |
| | status_code = 431 |
| |
|
| |
|
| | class HTTPUnavailableForLegalReasons(HTTPClientError): |
| | status_code = 451 |
| |
|
| | def __init__( |
| | self, |
| | link: Optional[StrOrURL], |
| | *, |
| | headers: Optional[LooseHeaders] = None, |
| | reason: Optional[str] = None, |
| | body: Any = None, |
| | text: Optional[str] = None, |
| | content_type: Optional[str] = None, |
| | ) -> None: |
| | super().__init__( |
| | headers=headers, |
| | reason=reason, |
| | body=body, |
| | text=text, |
| | content_type=content_type, |
| | ) |
| | self._link = None |
| | if link: |
| | self._link = URL(link) |
| | self.headers["Link"] = f'<{str(self._link)}>; rel="blocked-by"' |
| |
|
| | @property |
| | def link(self) -> Optional[URL]: |
| | return self._link |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | class HTTPServerError(HTTPError): |
| | pass |
| |
|
| |
|
| | class HTTPInternalServerError(HTTPServerError): |
| | status_code = 500 |
| |
|
| |
|
| | class HTTPNotImplemented(HTTPServerError): |
| | status_code = 501 |
| |
|
| |
|
| | class HTTPBadGateway(HTTPServerError): |
| | status_code = 502 |
| |
|
| |
|
| | class HTTPServiceUnavailable(HTTPServerError): |
| | status_code = 503 |
| |
|
| |
|
| | class HTTPGatewayTimeout(HTTPServerError): |
| | status_code = 504 |
| |
|
| |
|
| | class HTTPVersionNotSupported(HTTPServerError): |
| | status_code = 505 |
| |
|
| |
|
| | class HTTPVariantAlsoNegotiates(HTTPServerError): |
| | status_code = 506 |
| |
|
| |
|
| | class HTTPInsufficientStorage(HTTPServerError): |
| | status_code = 507 |
| |
|
| |
|
| | class HTTPNotExtended(HTTPServerError): |
| | status_code = 510 |
| |
|
| |
|
| | class HTTPNetworkAuthenticationRequired(HTTPServerError): |
| | status_code = 511 |
| |
|