From 50eb700571480d1440e15a387d10f98be8abab59 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Sun, 18 Oct 2020 00:39:14 +0200 Subject: [PATCH] client: Select hyper connector (TLS backend) at build time --- ruma-client/examples/message_log.rs | 4 +- ruma-client/src/lib.rs | 68 +++++++++-------------------- 2 files changed, 22 insertions(+), 50 deletions(-) diff --git a/ruma-client/examples/message_log.rs b/ruma-client/examples/message_log.rs index 20a72140..b8707045 100644 --- a/ruma-client/examples/message_log.rs +++ b/ruma-client/examples/message_log.rs @@ -11,10 +11,10 @@ use ruma::{ }, presence::PresenceState, }; -use ruma_client::{self, HttpClient}; +use ruma_client::{self, Client}; async fn log_messages(homeserver_url: Uri, username: &str, password: &str) -> anyhow::Result<()> { - let client = HttpClient::new(homeserver_url, None); + let client = Client::new(homeserver_url, None); client.log_in(username, password, None, None).await?; diff --git a/ruma-client/src/lib.rs b/ruma-client/src/lib.rs index 1d5d7113..5b1e49cc 100644 --- a/ruma-client/src/lib.rs +++ b/ruma-client/src/lib.rs @@ -10,7 +10,7 @@ //! //! let work = async { //! let homeserver_url = "https://example.com".parse().unwrap(); -//! let client = Client::https(homeserver_url, None); +//! let client = Client::new(homeserver_url, None); //! //! let session = client //! .log_in("@alice:example.com", "secret", None, None) @@ -32,7 +32,7 @@ //! let work = async { //! let homeserver_url = "https://example.com".parse().unwrap(); //! let session = Session{access_token: "as_access_token".to_string(), identification: None}; -//! let client = Client::https(homeserver_url, Some(session)); +//! let client = Client::new(homeserver_url, Some(session)); //! //! // make calls to the API //! }; @@ -48,7 +48,7 @@ //! # use ruma_client::Client; //! # use ruma::presence::PresenceState; //! # let homeserver_url = "https://example.com".parse().unwrap(); -//! # let client = Client::https(homeserver_url, None); +//! # let client = Client::new(homeserver_url, None); //! # let next_batch_token = String::new(); //! # async { //! let mut sync_stream = Box::pin(client.sync( @@ -78,7 +78,7 @@ //! ```no_run //! # use ruma_client::Client; //! # let homeserver_url = "https://example.com".parse().unwrap(); -//! # let client = Client::https(homeserver_url, None); +//! # let client = Client::new(homeserver_url, None); //! use std::convert::TryFrom; //! //! use ruma::{ @@ -111,8 +111,6 @@ use futures_core::stream::{Stream, TryStream}; use futures_util::stream; use http::{uri::Uri, Response as HttpResponse}; use hyper::{client::HttpConnector, Client as HyperClient}; -#[cfg(feature = "hyper-tls")] -use hyper_tls::HttpsConnector; use ruma_api::{AuthScheme, OutgoingRequest}; use ruma_client_api::r0::sync::sync_events::{ Filter as SyncFilter, Request as SyncRequest, Response as SyncResponse, @@ -129,68 +127,48 @@ pub use self::{ session::{Identification, Session}, }; +#[cfg(not(feature = "tls"))] +type Connector = HttpConnector; + +#[cfg(feature = "tls")] +type Connector = hyper_tls::HttpsConnector; + /// A client for the Matrix client-server API. -#[derive(Debug)] -pub struct Client(Arc>); +#[derive(Clone, Debug)] +pub struct Client(Arc); /// Data contained in Client's Rc #[derive(Debug)] -struct ClientData { +struct ClientData { /// The URL of the homeserver to connect to. homeserver_url: Uri, /// The underlying HTTP client. - hyper: HyperClient, + hyper: HyperClient, /// User session data. session: Mutex>, } -/// Non-secured variant of the client (using plain HTTP requests) -pub type HttpClient = Client; - -impl HttpClient { - /// Creates a new client for making HTTP requests to the given homeserver. +impl Client { + /// Creates a new client. pub fn new(homeserver_url: Uri, session: Option) -> Self { Self(Arc::new(ClientData { homeserver_url, - hyper: HyperClient::builder().build_http(), + hyper: HyperClient::builder().build(Connector::new()), session: Mutex::new(session), })) } -} -/// Secured variant of the client (using HTTPS requests) -#[cfg(feature = "tls")] -pub type HttpsClient = Client>; - -#[cfg(feature = "tls")] -impl HttpsClient { - /// Creates a new client for making HTTPS requests to the given homeserver. - pub fn https(homeserver_url: Uri, session: Option) -> Self { - let connector = HttpsConnector::new(); - - Self(Arc::new(ClientData { - homeserver_url, - hyper: HyperClient::builder().build(connector), - session: Mutex::new(session), - })) - } -} - -impl Client -where - C: hyper::client::connect::Connect + Clone + Send + Sync + 'static, -{ - /// Creates a new client using the given `hyper::Client`. + /// Creates a new client using the given `hyper::client::Builder`. /// /// This allows the user to configure the details of HTTP as desired. pub fn custom( - hyper_client: HyperClient, + client_builder: &hyper::client::Builder, homeserver_url: Uri, session: Option, ) -> Self { Self(Arc::new(ClientData { homeserver_url, - hyper: hyper_client, + hyper: client_builder.build(Connector::new()), session: Mutex::new(session), })) } @@ -380,9 +358,3 @@ where Ok(Request::IncomingResponse::try_from(full_response)?) } } - -impl Clone for Client { - fn clone(&self) -> Self { - Self(self.0.clone()) - } -}