| 157 | |
| 158 | |
| 159 | class HttpStream(layer.Layer): |
| 160 | request_body_buf: ReceiveBuffer |
| 161 | response_body_buf: ReceiveBuffer |
| 162 | flow: http.HTTPFlow |
| 163 | stream_id: StreamId |
| 164 | child_layer: layer.Layer | None = None |
| 165 | |
| 166 | @cached_property |
| 167 | def mode(self) -> HTTPMode: |
| 168 | i = self.context.layers.index(self) |
| 169 | parent = self.context.layers[i - 1] |
| 170 | assert isinstance(parent, HttpLayer) |
| 171 | return parent.mode |
| 172 | |
| 173 | def __init__(self, context: Context, stream_id: int) -> None: |
| 174 | super().__init__(context) |
| 175 | self.request_body_buf = ReceiveBuffer() |
| 176 | self.response_body_buf = ReceiveBuffer() |
| 177 | self.client_state = self.state_uninitialized |
| 178 | self.server_state = self.state_uninitialized |
| 179 | self.stream_id = stream_id |
| 180 | |
| 181 | def __repr__(self): |
| 182 | if self._handle_event == self.passthrough: |
| 183 | return f"HttpStream(id={self.stream_id}, passthrough)" |
| 184 | else: |
| 185 | return ( |
| 186 | f"HttpStream(" |
| 187 | f"id={self.stream_id}, " |
| 188 | f"client_state={self.client_state.__name__}, " |
| 189 | f"server_state={self.server_state.__name__}" |
| 190 | f")" |
| 191 | ) |
| 192 | |
| 193 | @expect(events.Start, HttpEvent) |
| 194 | def _handle_event(self, event: events.Event) -> layer.CommandGenerator[None]: |
| 195 | if isinstance(event, events.Start): |
| 196 | self.client_state = self.state_wait_for_request_headers |
| 197 | elif isinstance(event, (RequestProtocolError, ResponseProtocolError)): |
| 198 | yield from self.handle_protocol_error(event) |
| 199 | elif isinstance( |
| 200 | event, (RequestHeaders, RequestData, RequestTrailers, RequestEndOfMessage) |
| 201 | ): |
| 202 | yield from self.client_state(event) |
| 203 | else: |
| 204 | yield from self.server_state(event) |
| 205 | |
| 206 | @expect(RequestHeaders) |
| 207 | def state_wait_for_request_headers( |
| 208 | self, event: RequestHeaders |
| 209 | ) -> layer.CommandGenerator[None]: |
| 210 | if not event.replay_flow: |
| 211 | self.flow = http.HTTPFlow(self.context.client, self.context.server) |
| 212 | |
| 213 | else: |
| 214 | self.flow = event.replay_flow |
| 215 | self.flow.request = event.request |
| 216 | self.flow.live = True |
no outgoing calls
no test coverage detected
searching dependent graphs…