chore: Update to base64 0.21 (#1228)
This commit is contained in:
@@ -15,7 +15,7 @@ repository = "https://github.com/hyperium/tonic"
|
|||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
base64 = "0.13"
|
base64 = "0.21"
|
||||||
bytes = "1.0"
|
bytes = "1.0"
|
||||||
futures-core = "0.3"
|
futures-core = "0.3"
|
||||||
http = "0.2"
|
http = "0.2"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use std::error::Error;
|
|||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::task::{Context, Poll};
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
|
use base64::Engine as _;
|
||||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||||
use futures_core::{ready, Stream};
|
use futures_core::{ready, Stream};
|
||||||
use http::{header, HeaderMap, HeaderValue};
|
use http::{header, HeaderMap, HeaderValue};
|
||||||
@@ -100,7 +101,8 @@ impl<B> GrpcWebCall<B> {
|
|||||||
// returned `Bytes`, keeping the rest for the next attempt to decode.
|
// returned `Bytes`, keeping the rest for the next attempt to decode.
|
||||||
let index = self.max_decodable();
|
let index = self.max_decodable();
|
||||||
|
|
||||||
base64::decode(self.as_mut().project().buf.split_to(index))
|
crate::util::base64::STANDARD
|
||||||
|
.decode(self.as_mut().project().buf.split_to(index))
|
||||||
.map(|decoded| Some(Bytes::from(decoded)))
|
.map(|decoded| Some(Bytes::from(decoded)))
|
||||||
.map_err(internal_error)
|
.map_err(internal_error)
|
||||||
}
|
}
|
||||||
@@ -151,7 +153,7 @@ where
|
|||||||
|
|
||||||
if let Some(mut res) = ready!(this.inner.as_mut().poll_data(cx)) {
|
if let Some(mut res) = ready!(this.inner.as_mut().poll_data(cx)) {
|
||||||
if *this.encoding == Encoding::Base64 {
|
if *this.encoding == Encoding::Base64 {
|
||||||
res = res.map(|b| base64::encode(b).into())
|
res = res.map(|b| crate::util::base64::STANDARD.encode(b).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
return Poll::Ready(Some(res.map_err(internal_error)));
|
return Poll::Ready(Some(res.map_err(internal_error)));
|
||||||
@@ -165,7 +167,7 @@ where
|
|||||||
let mut frame = make_trailers_frame(map);
|
let mut frame = make_trailers_frame(map);
|
||||||
|
|
||||||
if *this.encoding == Encoding::Base64 {
|
if *this.encoding == Encoding::Base64 {
|
||||||
frame = base64::encode(frame).into_bytes();
|
frame = crate::util::base64::STANDARD.encode(frame).into_bytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
*this.poll_trailers = false;
|
*this.poll_trailers = false;
|
||||||
|
|||||||
@@ -139,3 +139,22 @@ where
|
|||||||
)
|
)
|
||||||
.layer(GrpcWebService::new(service))
|
.layer(GrpcWebService::new(service))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) mod util {
|
||||||
|
pub(crate) mod base64 {
|
||||||
|
use base64::{
|
||||||
|
alphabet,
|
||||||
|
engine::{
|
||||||
|
general_purpose::{GeneralPurpose, GeneralPurposeConfig},
|
||||||
|
DecodePaddingMode,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub(crate) const STANDARD: GeneralPurpose = GeneralPurpose::new(
|
||||||
|
&alphabet::STANDARD,
|
||||||
|
GeneralPurposeConfig::new()
|
||||||
|
.with_encode_padding(true)
|
||||||
|
.with_decode_padding_mode(DecodePaddingMode::Indifferent),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ channel = [
|
|||||||
# harness = false
|
# harness = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
base64 = "0.13"
|
base64 = "0.21"
|
||||||
bytes = "1.0"
|
bytes = "1.0"
|
||||||
futures-core = {version = "0.3", default-features = false}
|
futures-core = {version = "0.3", default-features = false}
|
||||||
futures-util = {version = "0.3", default-features = false}
|
futures-util = {version = "0.3", default-features = false}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use base64::Engine as _;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use http::header::HeaderValue;
|
use http::header::HeaderValue;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
@@ -127,7 +128,7 @@ impl self::value_encoding::Sealed for Binary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn from_bytes(value: &[u8]) -> Result<HeaderValue, InvalidMetadataValueBytes> {
|
fn from_bytes(value: &[u8]) -> Result<HeaderValue, InvalidMetadataValueBytes> {
|
||||||
let encoded_value: String = base64::encode_config(value, base64::STANDARD_NO_PAD);
|
let encoded_value: String = crate::util::base64::STANDARD_NO_PAD.encode(value);
|
||||||
HeaderValue::from_maybe_shared(Bytes::from(encoded_value))
|
HeaderValue::from_maybe_shared(Bytes::from(encoded_value))
|
||||||
.map_err(|_| InvalidMetadataValueBytes::new())
|
.map_err(|_| InvalidMetadataValueBytes::new())
|
||||||
}
|
}
|
||||||
@@ -137,7 +138,7 @@ impl self::value_encoding::Sealed for Binary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn from_static(value: &'static str) -> HeaderValue {
|
fn from_static(value: &'static str) -> HeaderValue {
|
||||||
if base64::decode(value).is_err() {
|
if crate::util::base64::STANDARD.decode(value).is_err() {
|
||||||
panic!("Invalid base64 passed to from_static: {}", value);
|
panic!("Invalid base64 passed to from_static: {}", value);
|
||||||
}
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
@@ -148,13 +149,14 @@ impl self::value_encoding::Sealed for Binary {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn decode(value: &[u8]) -> Result<Bytes, InvalidMetadataValueBytes> {
|
fn decode(value: &[u8]) -> Result<Bytes, InvalidMetadataValueBytes> {
|
||||||
base64::decode(value)
|
crate::util::base64::STANDARD
|
||||||
|
.decode(value)
|
||||||
.map(|bytes_vec| bytes_vec.into())
|
.map(|bytes_vec| bytes_vec.into())
|
||||||
.map_err(|_| InvalidMetadataValueBytes::new())
|
.map_err(|_| InvalidMetadataValueBytes::new())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn equals(a: &HeaderValue, b: &[u8]) -> bool {
|
fn equals(a: &HeaderValue, b: &[u8]) -> bool {
|
||||||
if let Ok(decoded) = base64::decode(a.as_bytes()) {
|
if let Ok(decoded) = crate::util::base64::STANDARD.decode(a.as_bytes()) {
|
||||||
decoded == b
|
decoded == b
|
||||||
} else {
|
} else {
|
||||||
a.as_bytes() == b
|
a.as_bytes() == b
|
||||||
|
|||||||
+5
-3
@@ -1,5 +1,6 @@
|
|||||||
use crate::body::BoxBody;
|
use crate::body::BoxBody;
|
||||||
use crate::metadata::MetadataMap;
|
use crate::metadata::MetadataMap;
|
||||||
|
use base64::Engine as _;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use http::header::{HeaderMap, HeaderValue};
|
use http::header::{HeaderMap, HeaderValue};
|
||||||
use percent_encoding::{percent_decode, percent_encode, AsciiSet, CONTROLS};
|
use percent_encoding::{percent_decode, percent_encode, AsciiSet, CONTROLS};
|
||||||
@@ -435,7 +436,8 @@ impl Status {
|
|||||||
let details = header_map
|
let details = header_map
|
||||||
.get(GRPC_STATUS_DETAILS_HEADER)
|
.get(GRPC_STATUS_DETAILS_HEADER)
|
||||||
.map(|h| {
|
.map(|h| {
|
||||||
base64::decode(h.as_bytes())
|
crate::util::base64::STANDARD
|
||||||
|
.decode(h.as_bytes())
|
||||||
.expect("Invalid status header, expected base64 encoded value")
|
.expect("Invalid status header, expected base64 encoded value")
|
||||||
})
|
})
|
||||||
.map(Bytes::from)
|
.map(Bytes::from)
|
||||||
@@ -516,7 +518,7 @@ impl Status {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !self.details.is_empty() {
|
if !self.details.is_empty() {
|
||||||
let details = base64::encode_config(&self.details[..], base64::STANDARD_NO_PAD);
|
let details = crate::util::base64::STANDARD_NO_PAD.encode(&self.details[..]);
|
||||||
|
|
||||||
header_map.insert(
|
header_map.insert(
|
||||||
GRPC_STATUS_DETAILS_HEADER,
|
GRPC_STATUS_DETAILS_HEADER,
|
||||||
@@ -971,7 +973,7 @@ mod tests {
|
|||||||
|
|
||||||
let header_map = status.to_header_map().unwrap();
|
let header_map = status.to_header_map().unwrap();
|
||||||
|
|
||||||
let b64_details = base64::encode_config(DETAILS, base64::STANDARD_NO_PAD);
|
let b64_details = crate::util::base64::STANDARD_NO_PAD.encode(DETAILS);
|
||||||
|
|
||||||
assert_eq!(header_map[super::GRPC_STATUS_DETAILS_HEADER], b64_details);
|
assert_eq!(header_map[super::GRPC_STATUS_DETAILS_HEADER], b64_details);
|
||||||
|
|
||||||
|
|||||||
@@ -11,3 +11,27 @@ pub(crate) enum OptionPin<T> {
|
|||||||
Some(#[pin] T),
|
Some(#[pin] T),
|
||||||
None,
|
None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) mod base64 {
|
||||||
|
use base64::{
|
||||||
|
alphabet,
|
||||||
|
engine::{
|
||||||
|
general_purpose::{GeneralPurpose, GeneralPurposeConfig},
|
||||||
|
DecodePaddingMode,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub(crate) const STANDARD: GeneralPurpose = GeneralPurpose::new(
|
||||||
|
&alphabet::STANDARD,
|
||||||
|
GeneralPurposeConfig::new()
|
||||||
|
.with_encode_padding(true)
|
||||||
|
.with_decode_padding_mode(DecodePaddingMode::Indifferent),
|
||||||
|
);
|
||||||
|
|
||||||
|
pub(crate) const STANDARD_NO_PAD: GeneralPurpose = GeneralPurpose::new(
|
||||||
|
&alphabet::STANDARD,
|
||||||
|
GeneralPurposeConfig::new()
|
||||||
|
.with_encode_padding(false)
|
||||||
|
.with_decode_padding_mode(DecodePaddingMode::Indifferent),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user