from __future__ import annotations from typing import Any, Mapping from requests.structures import CaseInsensitiveDict from ..cookies import CookieJar, cookiejar_from_dict, create_cookie __all__ = ["Response"] class Response: __default_status_code: int = 200 __default_headers: Mapping[str, str] = {"Content-Type": "application/json"} def __init__( self, body: str = "", status_code: int = __default_status_code, headers: Mapping[str, str] | None = None, cookies: Mapping[str, str] | CookieJar | None = None, ): self.body = body self.status_code = status_code if headers is None: headers = {} self.headers = CaseInsensitiveDict(headers) self.cookie_jar: CookieJar = self._get_cookie_jar(cookies) @staticmethod def _get_cookie_jar(cookies: Mapping[str, str] | CookieJar | None) -> CookieJar: if isinstance(cookies, CookieJar): return cookies if isinstance(cookies, dict): return cookiejar_from_dict(cookies, CookieJar()) return CookieJar() def set_cookie(self, name: str, value: Any = None, **kwargs): cookie = create_cookie(name, value, **kwargs) self.cookie_jar.set_cookie(cookie) def _get_cookie_header(self) -> str: cookie_strings = [] for cookie in self.cookie_jar: cookie_str = ( f"{cookie.name}={cookie.value}" f'{f"; Domain={cookie.domain}" if cookie.domain else ""}' f"; Path={cookie.path}" f'{"; Secure" if cookie.secure else ""}' f'{"; HttpOnly" if cookie.has_nonstandard_attr("HttpOnly") else ""}' f'{f"; Expires={cookie.expires}" if cookie.expires else ""}' ) cookie_strings.append(cookie_str) return "; ".join(cookie_strings) def _get_headers(self) -> Mapping[str, str]: headers = dict(self.__default_headers, **self.headers) cookie_header = self._get_cookie_header() if cookie_header: headers["Set-Cookie"] = cookie_header return headers def to_dict(self) -> dict[str, Any]: return {"statusCode": self.status_code, "body": self.body, "headers": self._get_headers()} def __repr__(self): attrs = ("status_code", "body", "headers") return f"<{self.__class__.__qualname__} {', '.join(f'{attr}: {getattr(self, attr)}' for attr in attrs)}>"