code: async def send_request(self):
          
          if self._send_request_done:
              raise ProtocolError('Request is already sent')
  
          with self._wrapper:
              protocol = await self._channel.__connect__()
              stream = protocol.processor.connection\
                  .create_stream(wrapper=self._wrapper)
  
              headers = [
                  (':method', 'POST'),
                  (':scheme', self._channel._scheme),
                  (':path', self._method_name),
                  (':authority', self._channel._authority),
              ]
              if self._deadline is not None:
                  timeout = self._deadline.time_remaining()
                  headers.append(('grpc-timeout', encode_timeout(timeout)))
              content_type = (GRPC_CONTENT_TYPE
                              + '+' + self._codec.__content_subtype__)
              headers.extend((
                  ('te', 'trailers'),
                  ('content-type', content_type),
                  ('user-agent', USER_AGENT),
              ))
              metadata, = await self._dispatch.send_request(
                  self._metadata,
                  method_name=self._method_name,
                  deadline=self._deadline,
                  content_type=content_type,
              )
              headers.extend(encode_metadata(metadata))
              release_stream = await stream.send_request(
                  headers, _processor=protocol.processor,
              )
              self._stream = stream
              self._release_stream = release_stream
              self._send_request_done = True
docs: Coroutine to send request headers with metadata to the server.
  
          New HTTP/2 stream will be created during this coroutine call.
  
          .. note:: This coroutine will be called implicitly during first
              :py:meth:`send_message` coroutine call, if not called before
              explicitly.