docs: def request(self, method: str, path: str, content: Optional[Union[dict, bytes, str]] = None,
                  timestamp: Optional[int] = None, external_url: Optional[str] = None,
                  headers: Optional[Dict[str, str]] = None,
                  query_params: Optional[Dict[str, Any]] = None,
                  api_path: str = "/_matrix/client/r0") -> Awaitable[dict]:
          """
          Make a raw HTTP request.
  
          Args:
              method: The HTTP method to use.
              path: The API endpoint to call. Does not include the base path (e.g. /_matrix/client/r0).
              content: The content to post as a dict (json) or bytes/str (raw).
              timestamp: The timestamp query param used for timestamp massaging.
              external_url: The external_url field to send in the content
                  (only applicable if content is dict).
              headers: The dict of HTTP headers to send.
              query_params: The dict of query parameters to send.
              api_path: The base API path.
  
          Returns:
              The response as a dict.
          """
          content = content or {}
          headers = headers or {}
          query_params = query_params or {}
          query_params["access_token"] = self.token
  
          if timestamp is not None:
              if isinstance(timestamp, datetime):
                  timestamp = int(timestamp.replace(tzinfo=timezone.utc).timestamp() * 1000)
              query_params["ts"] = timestamp
          if isinstance(content, dict) and external_url is not None:
              content["external_url"] = external_url
  
          method = method.upper()
          if method not in ["GET", "PUT", "DELETE", "POST"]:
              raise MatrixError("Unsupported HTTP method: %s" % method)
  
          if "Content-Type" not in headers:
              headers["Content-Type"] = "application/json"
          if headers.get("Content-Type", None) == "application/json":
              content = json.dumps(content)
  
          if self.identity and not self.is_real_user:
              query_params["user_id"] = self.identity
  
          self._log_request(method, path, content, query_params)
  
          endpoint = self.base_url + api_path + path
          return self._send(method, endpoint, content, query_params, headers or {})