def mock_once(self, http1obj, req): self.call += 1 if self.call == 2: headers = http1.assemble_request_head(req) http1obj.server_conn.wfile.write(headers) http1obj.server_conn.wfile.flush() raise exceptions.TcpDisconnect else: headers = http1.assemble_request_head(req) http1obj.server_conn.wfile.write(headers) http1obj.server_conn.wfile.flush()
def send(self, event: HttpEvent) -> layer.CommandGenerator[None]: if isinstance(event, RequestProtocolError): yield commands.CloseConnection(self.conn) return if not self.stream_id: assert isinstance(event, RequestHeaders) self.stream_id = event.stream_id self.request = event.request assert self.stream_id == event.stream_id if isinstance(event, RequestHeaders): request = event.request if request.is_http2: # Convert to an HTTP/1 request. request = request.copy( ) # (we could probably be a bit more efficient here.) request.http_version = "HTTP/1.1" if "Host" not in request.headers and request.authority: request.headers.insert(0, "Host", request.authority) request.authority = "" raw = http1.assemble_request_head(request) yield commands.SendData(self.conn, raw) elif isinstance(event, RequestData): assert self.request if "chunked" in self.request.headers.get("transfer-encoding", "").lower(): raw = b"%x\r\n%s\r\n" % (len(event.data), event.data) else: raw = event.data if raw: yield commands.SendData(self.conn, raw) elif isinstance(event, RequestEndOfMessage): assert self.request if "chunked" in self.request.headers.get("transfer-encoding", "").lower(): yield commands.SendData(self.conn, b"0\r\n\r\n") elif http1.expected_http_body_size(self.request, self.response) == -1: yield commands.CloseConnection(self.conn, half_close=True) yield from self.mark_done(request=True) else: raise AssertionError(f"Unexpected event: {event}")
def send_request_headers(self, request): headers = http1.assemble_request_head(request) self.server_conn.wfile.write(headers) self.server_conn.wfile.flush()