| 55 | |
| 56 | |
| 57 | class Response: |
| 58 | def __init__(self, |
| 59 | request: Request, |
| 60 | status: int, |
| 61 | body: bytes = None, |
| 62 | headers: Headers = None): |
| 63 | self.request = request |
| 64 | self.status = status |
| 65 | self.body = body or bytes() |
| 66 | self.headers = headers or {} |
| 67 | |
| 68 | @property |
| 69 | def json(self): |
| 70 | if not hasattr(self, '_json'): |
| 71 | self._json = json.loads(self.body) |
| 72 | return self._json |
| 73 | |
| 74 | def __str__(self): |
| 75 | return f'{self.request}: {self.status}' |
| 76 | |
| 77 | def get_url_with_query_string(self) -> str: |
| 78 | url = self.request.url |
| 79 | if self.request.query_args is not None: |
| 80 | url = f'{url}?{urlencode(self.request.query_args)}' |
| 81 | return url |
| 82 | |
| 83 | |
| 84 | # Sentinel value to abort processing of requests/responses in hooks |