code: def start_request(self, headers, *, end_stream=False):
          
          yield from _wait_for_events(self._resumed, self._stream_creatable)
          stream_id = self._conn.get_next_available_stream_id()
          self._priority.insert_stream(stream_id)
          self._priority.block(stream_id)
          self._conn.send_headers(stream_id, headers, end_stream=end_stream)
          self._flush()
          return stream_id
docs: Start a request by sending given headers on a new stream, and return
          the ID of the new stream.
  
          This may block until the underlying transport becomes writable, and
          the number of concurrent outbound requests (open outbound streams) is
          less than the value of peer config MAX_CONCURRENT_STREAMS.
  
          The completion of the call to this method does not mean the request is
          successfully delivered - data is only correctly stored in a buffer to
          be sent. There's no guarantee it is truly delivered.
  
          :param headers: A list of key-value tuples as headers.
          :param end_stream: To send a request without body, set `end_stream` to
                             `True` (default `False`).
          :return: Stream ID as a integer, used for further communication.