From 81cea84a37a973dbbf2f164731706a88bf1a3ecd Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Thu, 10 Mar 2022 15:00:40 +0100 Subject: [PATCH] Fetch supported matrix versions from server in initialization --- crates/matrix-sdk/src/client.rs | 23 +++++++++++++++++------ crates/matrix-sdk/src/http_client.rs | 15 +++++++++------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/crates/matrix-sdk/src/client.rs b/crates/matrix-sdk/src/client.rs index 42450ed08..5c0b69905 100644 --- a/crates/matrix-sdk/src/client.rs +++ b/crates/matrix-sdk/src/client.rs @@ -118,6 +118,8 @@ pub(crate) struct ClientInner { http_client: HttpClient, /// User session data. base_client: BaseClient, + /// The Matrix versions the server supports (well-known ones only) + server_versions: Arc<[MatrixVersion]>, /// Locks making sure we only have one group session sharing request in /// flight per room. #[cfg(feature = "encryption")] @@ -189,10 +191,17 @@ impl Client { let http_client = HttpClient::new(client, homeserver.clone(), session, config.request_config); + let server_versions = http_client + .send(get_supported_versions::Request::new(), None, vec![MatrixVersion::V1_0].into()) + .await? + .known_versions() + .collect(); + let inner = Arc::new(ClientInner { homeserver, http_client, base_client, + server_versions, #[cfg(feature = "encryption")] group_session_locks: Default::default(), #[cfg(feature = "encryption")] @@ -751,15 +760,13 @@ impl Client { .try_into_http_request::>( homeserver.as_str(), SendAccessToken::None, - // FIXME: Use versions reported by server - &[MatrixVersion::V1_0], + &self.inner.server_versions, ) } else { sso_login::v3::Request::new(redirect_url).try_into_http_request::>( homeserver.as_str(), SendAccessToken::None, - // FIXME: Use versions reported by server - &[MatrixVersion::V1_0], + &self.inner.server_versions, ) }; @@ -1542,7 +1549,11 @@ impl Client { }); let request_config = self.inner.http_client.request_config.timeout(timeout); - Ok(self.inner.http_client.upload(request, Some(request_config)).await?) + Ok(self + .inner + .http_client + .upload(request, Some(request_config), self.inner.server_versions.clone()) + .await?) } /// Send an arbitrary request to the server, without updating client state. @@ -1594,7 +1605,7 @@ impl Client { Request: OutgoingRequest + Debug, HttpError: From>, { - self.inner.http_client.send(request, config).await + self.inner.http_client.send(request, config, self.inner.server_versions.clone()).await } /// Get information of all our own devices. diff --git a/crates/matrix-sdk/src/http_client.rs b/crates/matrix-sdk/src/http_client.rs index 50e510a1e..4105d3cf6 100644 --- a/crates/matrix-sdk/src/http_client.rs +++ b/crates/matrix-sdk/src/http_client.rs @@ -115,6 +115,7 @@ impl HttpClient { request: Request, session: Arc>>, config: Option, + server_versions: Arc<[MatrixVersion]>, ) -> Result, HttpError> { let config = match config { Some(config) => config, @@ -150,8 +151,7 @@ impl HttpClient { request.try_into_http_request::( &self.homeserver.read().await.to_string(), send_access_token, - // FIXME: Use versions reported by server - &[MatrixVersion::V1_0], + &server_versions, )? } else { let (send_access_token, user_id) = { @@ -166,8 +166,7 @@ impl HttpClient { &self.homeserver.read().await.to_string(), send_access_token, &user_id, - // FIXME: Use versions reported by server - &[MatrixVersion::V1_0], + &server_versions, )? }; @@ -179,8 +178,10 @@ impl HttpClient { &self, request: create_content::v3::Request<'_>, config: Option, + server_versions: Arc<[MatrixVersion]>, ) -> Result { - let response = self.send_request(request, self.session.clone(), config).await?; + let response = + self.send_request(request, self.session.clone(), config, server_versions).await?; Ok(create_content::v3::Response::try_from_http_response(response)?) } @@ -188,12 +189,14 @@ impl HttpClient { &self, request: Request, config: Option, + server_versions: Arc<[MatrixVersion]>, ) -> Result where Request: OutgoingRequest + Debug, HttpError: From>, { - let response = self.send_request(request, self.session.clone(), config).await?; + let response = + self.send_request(request, self.session.clone(), config, server_versions).await?; trace!("Got response: {:?}", response);