(self, event: events.Event)
| 58 | ) |
| 59 | |
| 60 | def _handle_event(self, event: events.Event) -> layer.CommandGenerator[None]: |
| 61 | if isinstance(event, events.Start): |
| 62 | yield from self.h3_conn.transmit() |
| 63 | |
| 64 | # send mitmproxy HTTP events over the H3 connection |
| 65 | elif isinstance(event, HttpEvent): |
| 66 | try: |
| 67 | if isinstance(event, (RequestData, ResponseData)): |
| 68 | self.h3_conn.send_data(event.stream_id, event.data) |
| 69 | elif isinstance(event, (RequestHeaders, ResponseHeaders)): |
| 70 | headers = yield from ( |
| 71 | format_h2_request_headers(self.context, event) |
| 72 | if isinstance(event, RequestHeaders) |
| 73 | else format_h2_response_headers(self.context, event) |
| 74 | ) |
| 75 | self.h3_conn.send_headers( |
| 76 | event.stream_id, headers, end_stream=event.end_stream |
| 77 | ) |
| 78 | elif isinstance(event, (RequestTrailers, ResponseTrailers)): |
| 79 | self.h3_conn.send_trailers( |
| 80 | event.stream_id, [*event.trailers.fields] |
| 81 | ) |
| 82 | elif isinstance(event, (RequestEndOfMessage, ResponseEndOfMessage)): |
| 83 | self.h3_conn.end_stream(event.stream_id) |
| 84 | elif isinstance(event, (RequestProtocolError, ResponseProtocolError)): |
| 85 | status = event.code.http_status_code() |
| 86 | if ( |
| 87 | isinstance(event, ResponseProtocolError) |
| 88 | and not self.h3_conn.has_sent_headers(event.stream_id) |
| 89 | and status is not None |
| 90 | ): |
| 91 | self.h3_conn.send_headers( |
| 92 | event.stream_id, |
| 93 | [ |
| 94 | (b":status", b"%d" % status), |
| 95 | (b"server", version.MITMPROXY.encode()), |
| 96 | (b"content-type", b"text/html"), |
| 97 | ], |
| 98 | ) |
| 99 | self.h3_conn.send_data( |
| 100 | event.stream_id, |
| 101 | format_error(status, event.message), |
| 102 | end_stream=True, |
| 103 | ) |
| 104 | else: |
| 105 | match event.code: |
| 106 | case ErrorCode.CANCEL | ErrorCode.CLIENT_DISCONNECTED: |
| 107 | error_code = H3ErrorCode.H3_REQUEST_CANCELLED |
| 108 | case ErrorCode.KILL: |
| 109 | error_code = H3ErrorCode.H3_INTERNAL_ERROR |
| 110 | case ErrorCode.HTTP_1_1_REQUIRED: |
| 111 | error_code = H3ErrorCode.H3_VERSION_FALLBACK |
| 112 | case ErrorCode.PASSTHROUGH_CLOSE: |
| 113 | # FIXME: This probably shouldn't be a protocol error, but an EOM event. |
| 114 | error_code = H3ErrorCode.H3_REQUEST_CANCELLED |
| 115 | case ( |
| 116 | ErrorCode.GENERIC_CLIENT_ERROR |
| 117 | | ErrorCode.GENERIC_SERVER_ERROR |
nothing calls this directly
no test coverage detected