def data_received(self, data): try: self.parser.feed_data(data) except httptools.parser.errors.HttpParserError: msg = "Invalid HTTP request received." self.logger.warn(msg) self.transport.close() except httptools.HttpParserUpgrade: websocket_upgrade(self)
def data_received(self, data): try: self.parser.feed_data(data) except httptools.HttpParserUpgrade: websocket_upgrade(self)
def handle_events(self): while True: try: event = self.conn.next_event() except h11.RemoteProtocolError: msg = "Invalid HTTP request received." self.logger.warn(msg) self.transport.close() return event_type = type(event) if event_type is h11.NEED_DATA: break elif event_type is h11.PAUSED: # This case can occur in HTTP pipelining, so we need to # stop reading any more data, and ensure that at the end # of the active request/response cycle we handle any # events that have been buffered up. self.pause_reading() self.cycle.done_callback = self.on_response_complete break elif event_type is h11.Request: self.headers = event.headers path, _, query_string = event.target.partition(b"?") self.scope = { "type": "http", "http_version": event.http_version.decode("ascii"), "server": self.server, "client": self.client, "scheme": self.scheme, "method": event.method.decode("ascii"), "path": unquote(path.decode("ascii")), "query_string": query_string, "headers": self.headers, } for header in self.headers: name, value = header[0].lower(), header[1].lower() if name == b"upgrade" and value == b"websocket": websocket_upgrade(self) return self.cycle = RequestResponseCycle(self.scope, self) self.loop.create_task(self.cycle.run_asgi(self.app)) elif event_type is h11.Data: if self.conn.our_state is h11.DONE: continue self.cycle.body += event.data if len(self.cycle.body) > HIGH_WATER_LIMIT: self.pause_reading() self.client_event.set() elif event_type is h11.EndOfMessage: if self.conn.our_state is h11.DONE: self.resume_reading() self.conn.start_next_cycle() continue self.cycle.more_body = False self.client_event.set()