(
self, *, request: bool = False, response: bool = False
)
| 169 | yield ReceiveHttp(ResponseEndOfMessage(self.stream_id)) |
| 170 | |
| 171 | def mark_done( |
| 172 | self, *, request: bool = False, response: bool = False |
| 173 | ) -> layer.CommandGenerator[None]: |
| 174 | if request: |
| 175 | self.request_done = True |
| 176 | if response: |
| 177 | self.response_done = True |
| 178 | if self.request_done and self.response_done: |
| 179 | assert self.request |
| 180 | assert self.response |
| 181 | if should_make_pipe(self.request, self.response): |
| 182 | yield from self.make_pipe() |
| 183 | return |
| 184 | try: |
| 185 | read_until_eof_semantics = ( |
| 186 | http1.expected_http_body_size(self.request, self.response) == -1 |
| 187 | ) |
| 188 | except ValueError: |
| 189 | # this may raise only now (and not earlier) because an addon set invalid headers, |
| 190 | # in which case it's not really clear what we are supposed to do. |
| 191 | read_until_eof_semantics = False |
| 192 | connection_done = ( |
| 193 | read_until_eof_semantics |
| 194 | or http1.connection_close( |
| 195 | self.request.http_version, self.request.headers |
| 196 | ) |
| 197 | or http1.connection_close( |
| 198 | self.response.http_version, self.response.headers |
| 199 | ) |
| 200 | # If we proxy HTTP/2 to HTTP/1, we only use upstream connections for one request. |
| 201 | # This simplifies our connection management quite a bit as we can rely on |
| 202 | # the proxyserver's max-connection-per-server throttling. |
| 203 | or ( |
| 204 | (self.request.is_http2 or self.request.is_http3) |
| 205 | and isinstance(self, Http1Client) |
| 206 | ) |
| 207 | ) |
| 208 | if connection_done: |
| 209 | yield commands.CloseConnection(self.conn) |
| 210 | self.state = self.done |
| 211 | return |
| 212 | self.request_done = self.response_done = False |
| 213 | self.request = self.response = None |
| 214 | if isinstance(self, Http1Server): |
| 215 | self.stream_id += 2 |
| 216 | else: |
| 217 | self.stream_id = None |
| 218 | self.state = self.read_headers |
| 219 | if self.buf: |
| 220 | yield from self.state(events.DataReceived(self.conn, b"")) |
| 221 | |
| 222 | |
| 223 | class Http1Server(Http1Connection): |
no test coverage detected