(
self, event: events.ConnectionEvent
)
| 279 | raise AssertionError(f"Unexpected event: {event}") |
| 280 | |
| 281 | def read_headers( |
| 282 | self, event: events.ConnectionEvent |
| 283 | ) -> layer.CommandGenerator[None]: |
| 284 | if isinstance(event, events.DataReceived): |
| 285 | request_head = self.buf.maybe_extract_lines() |
| 286 | if request_head: |
| 287 | try: |
| 288 | self.request = http1.read_request_head( |
| 289 | [bytes(x) for x in request_head] |
| 290 | ) |
| 291 | expected_body_size = http1.expected_http_body_size(self.request) |
| 292 | except ValueError as e: |
| 293 | yield commands.SendData(self.conn, make_error_response(400, str(e))) |
| 294 | yield commands.CloseConnection(self.conn) |
| 295 | if self.request: |
| 296 | # we have headers that we can show in the ui |
| 297 | yield ReceiveHttp( |
| 298 | RequestHeaders(self.stream_id, self.request, False) |
| 299 | ) |
| 300 | yield ReceiveHttp( |
| 301 | RequestProtocolError( |
| 302 | self.stream_id, str(e), ErrorCode.GENERIC_CLIENT_ERROR |
| 303 | ) |
| 304 | ) |
| 305 | else: |
| 306 | yield commands.Log( |
| 307 | f"{human.format_address(self.conn.peername)}: {e}" |
| 308 | ) |
| 309 | self.state = self.done |
| 310 | return |
| 311 | yield ReceiveHttp( |
| 312 | RequestHeaders( |
| 313 | self.stream_id, self.request, expected_body_size == 0 |
| 314 | ) |
| 315 | ) |
| 316 | self.body_reader = make_body_reader(expected_body_size) |
| 317 | self.state = self.read_body |
| 318 | yield from self.state(event) |
| 319 | else: |
| 320 | pass # FIXME: protect against header size DoS |
| 321 | elif isinstance(event, events.ConnectionClosed): |
| 322 | buf = bytes(self.buf) |
| 323 | if buf.strip(): |
| 324 | yield commands.Log( |
| 325 | f"Client closed connection before completing request headers: {buf!r}" |
| 326 | ) |
| 327 | yield commands.CloseConnection(self.conn) |
| 328 | else: |
| 329 | raise AssertionError(f"Unexpected event: {event}") |
| 330 | |
| 331 | def mark_done( |
| 332 | self, *, request: bool = False, response: bool = False |
nothing calls this directly
no test coverage detected