MCPcopy
hub / github.com/mitmproxy/mitmproxy / HttpStream

Class HttpStream

mitmproxy/proxy/layers/http/__init__.py:159–918  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

157
158
159class 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

Callers 1

make_streamMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…