diff --git a/Cargo.toml b/Cargo.toml index 8cbd02eac..a3e354616 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,6 +69,7 @@ __rustls = ["hyper-rustls", "tokio-rustls", "rustls", "__tls"] __internal_proxy_sys_no_cache = [] [dependencies] +base64 = "0.13" http = "0.2" url = "2.2" bytes = "0.5" @@ -79,7 +80,6 @@ mime_guess = "2.0" serde_json = { version = "1.0", optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -base64 = "0.13" encoding_rs = "0.8" futures-core = { version = "0.3.0", default-features = false } futures-util = { version = "0.3.0", default-features = false } diff --git a/src/wasm/request.rs b/src/wasm/request.rs index df7808345..6ca7f32ea 100644 --- a/src/wasm/request.rs +++ b/src/wasm/request.rs @@ -1,6 +1,8 @@ use std::convert::TryFrom; use std::fmt; +use std::io::Write; +use base64::write::EncoderWriter as Base64Encoder; use http::{request::Parts, Method, Request as HttpRequest}; use url::Url; #[cfg(feature = "json")] @@ -172,6 +174,25 @@ impl RequestBuilder { self } + /// Enable HTTP basic authentication. + pub fn basic_auth(self, username: U, password: Option

) -> RequestBuilder + where + U: fmt::Display, + P: fmt::Display, + { + let mut header_value = b"Basic ".to_vec(); + { + let mut encoder = Base64Encoder::new(&mut header_value, base64::STANDARD); + // The unwraps here are fine because Vec::write* is infallible. + write!(encoder, "{}:", username).unwrap(); + if let Some(password) = password { + write!(encoder, "{}", password).unwrap(); + } + } + + self.header(crate::header::AUTHORIZATION, header_value) + } + /// Enable HTTP bearer authentication. pub fn bearer_auth(self, token: T) -> RequestBuilder where