docs: def request(self,
                  method,
                  path,
                  data=None,
                  stream=False,
                  headers=None,
                  username=None,
                  password=None,
                  schema=None,
                  **kwargs):
          """Send a request
  
          Always set the Content-Length and the Content-Type header.
          """
          if headers is None:
              headers = {}
          if 'Content-Length' not in headers:
              length = super_len(data)
              if length is not None:
                  headers['Content-Length'] = length
  
          # Authentication credentials
          if username is not None:
              if 'Authorization' not in headers and username is not None:
                  credentials = username + ':'
                  if password is not None:
                      credentials += password
                  headers['Authorization'] = 'Basic %s' % b64encode(credentials.encode('utf-8')).decode('utf-8')
              # For backwards compatibility with Crate <= 2.2
              if 'X-User' not in headers:
                  headers['X-User'] = username
  
          if schema is not None:
              headers['Default-Schema'] = schema
          headers['Accept'] = 'application/json'
          headers['Content-Type'] = 'application/json'
          kwargs['assert_same_host'] = False
          kwargs['redirect'] = False
          kwargs['retries'] = Retry(read=0)
          return self.pool.urlopen(
              method,
              path,
              body=data,
              preload_content=not stream,
              headers=headers,
              **kwargs
          )