fix: Status::details leaking base64 encoding (#395)

Fixes #379
This commit is contained in:
Lucio Franco
2020-07-10 12:40:55 -04:00
committed by GitHub
parent 2b997b0c5f
commit 2c4c544d90
+22 -8
View File
@@ -474,10 +474,11 @@ impl Status {
}
if !self.details.is_empty() {
let details = base64::encode_config(&self.details[..], base64::STANDARD_NO_PAD);
header_map.insert(
GRPC_STATUS_DETAILS_HEADER,
HeaderValue::from_maybe_shared(self.details.clone())
.map_err(invalid_header_value_byte)?,
HeaderValue::from_maybe_shared(details).map_err(invalid_header_value_byte)?,
);
}
@@ -501,12 +502,6 @@ impl Status {
details: Bytes,
metadata: MetadataMap,
) -> Status {
let details = if details.is_empty() {
details
} else {
base64::encode_config(&details[..], base64::STANDARD_NO_PAD).into()
};
Status {
code,
message: message.into(),
@@ -837,4 +832,23 @@ mod tests {
assert_eq!(Status::data_loss("").code(), Code::DataLoss);
assert_eq!(Status::unauthenticated("").code(), Code::Unauthenticated);
}
#[test]
fn details() {
const DETAILS: &[u8] = &[0, 2, 3];
let status = Status::with_details(Code::Unavailable, "some message", DETAILS.into());
assert_eq!(&status.details()[..], DETAILS);
let header_map = status.to_header_map().unwrap();
let b64_details = base64::encode_config(&DETAILS[..], base64::STANDARD_NO_PAD);
assert_eq!(header_map[super::GRPC_STATUS_DETAILS_HEADER], b64_details);
let status = Status::from_header_map(&header_map).unwrap();
assert_eq!(&status.details()[..], DETAILS);
}
}