Example #1
0
 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)
Example #2
0
 def data_received(self, data):
     try:
         self.parser.feed_data(data)
     except httptools.HttpParserUpgrade:
         websocket_upgrade(self)
Example #3
0
    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()