Как получить доступ к идентификатору потока HTTP / 2 при вызове send в приложение asgi? - PullRequest
1 голос
/ 11 мая 2019

Я создаю сервер приложений ASGI на python и реализую протокол HTTP / 2. Я получаю необработанные байты из сокета, анализирую байты и преобразую их в объекты кадра. Когда я запускаю приложение ASGI, вызываемый метод send получает только событие dict в качестве параметра, который не содержит идентификатор потока. Поскольку я использую async / await, мой сервер может обрабатывать несколько потоков одновременно. Как узнать, какой идентификатор потока связан с какой вызываемой отправкой?

class Server(object):
  async def send_response(self, event):
    # event dict does not contain stream id
    if event["type"] == "http.response.start":
      # Need stream id here to create http2 frames
      ...
    elif event["type"] == "http.response.body":
      # Need stream id here to create http2 frames
      ...

  async def handle_request(self):
    try:
      while True:
        self.request_data = self.client_connection.recv(4096)
        self.frame = self.parse_request(self.request_data)

        if isinstance(self.frame, HeadersFrame):
          # stream id is available here as self.frame.stream_id
          if self.frame.end_stream:
            asgi_scope = self.get_asgi_event_dict(self.frame)
            self.asgi_app = self.application(asgi_scope)
            await self.asgi_app(self.trigger_asgi_application, self.send_response)

Я хочу получить идентификатор потока в функции send_response.

...