"""
HTTP Exceptions
~~~~~~~~~~~~~~~
These are exceptions pertaining to common issues faced when executing HTTP
operations.
"""
from typing import Optional
from web_poet.page_inputs.http import HttpRequest, HttpResponse
[docs]class HttpError(IOError):
"""Indicates that an exception has occurred when handling an HTTP operation.
This is used as a **base class** for more specific errors and could be vague
since it could denote problems either in the HTTP Request or Response.
For more specific errors, it would be better to use :class:`.HttpRequestError`
and :class:`.HttpResponseError`.
:param request: Request that triggered the exception.
:type request: HttpRequest
"""
def __init__(
self, msg: Optional[str] = None, request: Optional[HttpRequest] = None
):
#: Request that triggered the exception.
self.request: Optional[HttpRequest] = request
if msg is None:
msg = f"An Error ocurred when executing this HTTP Request: {self.request}"
super().__init__(msg)
[docs]class HttpRequestError(HttpError):
"""Indicates that an exception has occurred when the **HTTP Request** was
being handled.
:param request: The :class:`~.HttpRequest` instance that was used.
:type request: HttpRequest
"""
pass
[docs]class HttpResponseError(HttpError):
"""Indicates that an exception has occurred when the **HTTP Response** was
received.
For responses that are in the status code ``100-3xx range``, this exception
shouldn't be raised at all. However, for responses in the ``400-5xx``, this
will be raised by **web-poet**.
.. note::
Frameworks implementing **web-poet** should **NOT** raise this exception.
This exception is raised by web-poet itself, based on ``allow_status``
parameter found in the methods of :class:`~.HttpClient`.
:param request: Request that got the response that triggered the exception.
:type request: HttpRequest
:param response: Response that triggered the exception.
:type response: HttpResponse
"""
def __init__(
self,
msg: Optional[str] = None,
response: Optional[HttpResponse] = None,
request: Optional[HttpRequest] = None,
):
#: Response that triggered the exception.
self.response: Optional[HttpResponse] = response
if msg is None:
msg = f"Unexpected HTTP Response received: {self.response}"
super().__init__(msg, request=request)