30 lines
879 B
Python
30 lines
879 B
Python
"""Transport-neutral cassette interaction model."""
|
|
|
|
import base64
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RecordedInteraction:
|
|
"""One completed HTTP exchange with exact response chunks."""
|
|
|
|
method: str
|
|
url: str
|
|
status: int
|
|
request_body: bytes
|
|
response_chunks: tuple[bytes, ...]
|
|
|
|
def as_dict(self) -> dict[str, object]:
|
|
"""Encode byte fields losslessly for JSON storage."""
|
|
return {
|
|
"method": self.method,
|
|
"url": self.url,
|
|
"status": self.status,
|
|
"request_body_base64": _encode(self.request_body),
|
|
"response_body_base64": _encode(b"".join(self.response_chunks)),
|
|
"response_chunks_base64": [_encode(chunk) for chunk in self.response_chunks],
|
|
}
|
|
|
|
|
|
def _encode(value: bytes) -> str:
|
|
return base64.b64encode(value).decode("ascii")
|