code: async def send_message(self, message, *, end=False):
          
          if not self._send_request_done:
              await self.send_request()
  
          if end and self._end_done:
              raise ProtocolError('Stream was already ended')
  
          with self._wrapper:
              message, = await self._dispatch.send_message(message)
              await send_message(self._stream, self._codec, message,
                                 self._send_type, end=end)
              self._send_message_count += 1
              if end:
                  self._end_done = True
docs: Coroutine to send message to the server.
  
          If client sends UNARY request, then you should call this coroutine only
          once. If client sends STREAM request, then you can call this coroutine
          as many times as you need.
  
          .. warning:: It is important to finally end stream from the client-side
              when you finished sending messages.
  
          You can do this in two ways:
  
          - specify ``end=True`` argument while sending last message - and last
            DATA frame will include END_STREAM flag;
          - call :py:meth:`end` coroutine after sending last message - and extra
            HEADERS frame with END_STREAM flag will be sent.
  
          First approach is preferred, because it doesn't require sending
          additional HTTP/2 frame.