Response to a given `Request`. Use in `Server.route` handler functions. Base class for all other response classes. Example:: @server.route(path, method) def route_func(request: Request): return Response(request, body='Some content', content_type="text/pla
| 51 | |
| 52 | |
| 53 | class Response: |
| 54 | """ |
| 55 | Response to a given `Request`. Use in `Server.route` handler functions. |
| 56 | |
| 57 | Base class for all other response classes. |
| 58 | |
| 59 | Example:: |
| 60 | |
| 61 | @server.route(path, method) |
| 62 | def route_func(request: Request): |
| 63 | |
| 64 | return Response(request, body='Some content', content_type="text/plain") |
| 65 | """ |
| 66 | |
| 67 | def __init__( |
| 68 | self, |
| 69 | request: Request, |
| 70 | body: Union[str, bytes] = "", |
| 71 | *, |
| 72 | status: Union[Status, Tuple[int, str]] = OK_200, |
| 73 | headers: Union[Headers, Dict[str, str]] = None, |
| 74 | cookies: Dict[str, str] = None, |
| 75 | content_type: str = None, |
| 76 | ) -> None: |
| 77 | """ |
| 78 | :param Request request: Request that this is a response to. |
| 79 | :param str body: Body of response. Defaults to empty string. |
| 80 | :param Status status: Status code and text. Defaults to 200 OK. |
| 81 | :param Headers headers: Headers to include in response. Defaults to empty dict. |
| 82 | :param Dict[str, str] cookies: Cookies to be sent with the response. |
| 83 | :param str content_type: Content type of response. Defaults to None. |
| 84 | """ |
| 85 | |
| 86 | self._request = request |
| 87 | self._body = body |
| 88 | self._status = status if isinstance(status, Status) else Status(*status) |
| 89 | self._headers = headers.copy() if isinstance(headers, Headers) else Headers(headers) |
| 90 | self._cookies = cookies.copy() if cookies else {} |
| 91 | self._content_type = content_type |
| 92 | self._size = 0 |
| 93 | |
| 94 | def _send_headers( |
| 95 | self, |
| 96 | content_length: Optional[int] = None, |
| 97 | content_type: str = None, |
| 98 | ) -> None: |
| 99 | headers = self._headers.copy() |
| 100 | |
| 101 | response_message_header = f"HTTP/1.1 {self._status.code} {self._status.text}\r\n" |
| 102 | |
| 103 | headers.setdefault("Content-Type", content_type or self._content_type or MIMETypes.DEFAULT) |
| 104 | headers.setdefault("Content-Length", content_length) |
| 105 | headers.setdefault("Connection", "close") |
| 106 | |
| 107 | for cookie_name, cookie_value in self._cookies.items(): |
| 108 | headers.add("Set-Cookie", f"{cookie_name}={cookie_value}") |
| 109 | |
| 110 | for header, value in headers.items(): |
no outgoing calls