From 3a24cc1d4b4131b7e6ab3420969b07b9df3cdbc6 Mon Sep 17 00:00:00 2001 From: Nathan West Date: Tue, 19 Nov 2019 10:45:14 -0800 Subject: [PATCH] Reimplemented RequestBuilder::basic_auth to use Base64Encoder (#713) --- src/async_impl/request.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/async_impl/request.rs b/src/async_impl/request.rs index f4fe960..50ed0af 100644 --- a/src/async_impl/request.rs +++ b/src/async_impl/request.rs @@ -1,7 +1,10 @@ use std::fmt; use std::future::Future; +use std::io::Write; -use base64::encode; +use base64; +use base64::write::EncoderWriter as Base64Encoder; +use bytes::Bytes; use serde::Serialize; #[cfg(feature = "json")] use serde_json; @@ -153,12 +156,17 @@ impl RequestBuilder { U: fmt::Display, P: fmt::Display, { - let auth = match password { - Some(password) => format!("{}:{}", username, password), - None => format!("{}:", username), - }; - let header_value = format!("Basic {}", encode(&auth)); - self.header(crate::header::AUTHORIZATION, &*header_value) + 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, Bytes::from(header_value)) } /// Enable HTTP bearer authentication. @@ -167,7 +175,7 @@ impl RequestBuilder { T: fmt::Display, { let header_value = format!("Bearer {}", token); - self.header(crate::header::AUTHORIZATION, &*header_value) + self.header(crate::header::AUTHORIZATION, header_value) } /// Set the request body.