From f990fd0589bb7f5d904c4ef613cd004c4883bcc1 Mon Sep 17 00:00:00 2001 From: Yotam Tanay Date: Sat, 3 Feb 2024 11:04:59 +0200 Subject: [PATCH 1/2] Add failing test case for reading base64 string via reader --- google-apis-common/src/serde.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/google-apis-common/src/serde.rs b/google-apis-common/src/serde.rs index 7d4f11b6c4..4c0a6f80f0 100644 --- a/google-apis-common/src/serde.rs +++ b/google-apis-common/src/serde.rs @@ -301,6 +301,14 @@ mod test { assert_eq!(Some(b"qXZo9:Smn:C~3)EXTI1QKtHv1(fTz}".as_slice()), wrapper.bytes.as_deref()); } + #[test] + #[should_panic(expected = "expected a borrowed string")] + fn standard_base64_de_reader_success_cases() { + let standard: Base64StandardWrapper = + serde_json::from_reader(r#"{"bytes": "cVhabzk6U21uOkN+MylFWFRJMVFLdEh2MShmVHp9"}"#.as_bytes()).unwrap(); + assert_eq!(Some(b"qXZo9:Smn:C~3)EXTI1QKtHv1(fTz}".as_slice()), standard.bytes.as_deref()); + } + #[test] fn urlsafe_base64_de_success_cases() { let wrapper: Base64URLSafeWrapper = @@ -308,6 +316,14 @@ mod test { assert_eq!(Some(b"hello world".as_slice()), wrapper.bytes.as_deref()); } + #[test] + #[should_panic(expected = "expected a borrowed string")] + fn urlsafe_base64_de_reader_success_cases() { + let url_safe: Base64URLSafeWrapper = + serde_json::from_reader(r#"{"bytes": "aGVsbG8gd29ybGQ="}"#.as_bytes()).unwrap(); + assert_eq!(Some(b"hello world".as_slice()), url_safe.bytes.as_deref()); + } + #[test] fn urlsafe_base64_de_failure_cases() { assert!(serde_json::from_str::(r#"{"bytes": "aGVsbG8gd29ybG+Q"}"#).is_err()); From a8d735628215d13d736447e919d0bd57767135c5 Mon Sep 17 00:00:00 2001 From: Yotam Tanay Date: Sat, 3 Feb 2024 11:07:11 +0200 Subject: [PATCH 2/2] Use Cow for reading base64 strings --- google-apis-common/src/serde.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/google-apis-common/src/serde.rs b/google-apis-common/src/serde.rs index 4c0a6f80f0..eee2c031f2 100644 --- a/google-apis-common/src/serde.rs +++ b/google-apis-common/src/serde.rs @@ -139,7 +139,8 @@ pub mod duration { pub mod standard_base64 { use serde::{Deserialize, Deserializer, Serializer}; use serde_with::{DeserializeAs, SerializeAs}; - + use std::borrow::Cow; + pub struct Wrapper; pub fn to_string(bytes: &Vec) -> String { @@ -160,8 +161,8 @@ pub mod standard_base64 { where D: Deserializer<'de>, { - let s: &str = Deserialize::deserialize(deserializer)?; - base64::decode_config(s, base64::STANDARD).map_err(serde::de::Error::custom) + let s: Cow = Deserialize::deserialize(deserializer)?; + base64::decode_config(s.as_ref(), base64::STANDARD).map_err(serde::de::Error::custom) } } } @@ -169,6 +170,7 @@ pub mod standard_base64 { pub mod urlsafe_base64 { use serde::{Deserialize, Deserializer, Serializer}; use serde_with::{DeserializeAs, SerializeAs}; + use std::borrow::Cow; pub struct Wrapper; @@ -190,8 +192,8 @@ pub mod urlsafe_base64 { where D: Deserializer<'de>, { - let s: &str = Deserialize::deserialize(deserializer)?; - base64::decode_config(s, base64::URL_SAFE).map_err(serde::de::Error::custom) + let s: Cow = Deserialize::deserialize(deserializer)?; + base64::decode_config(s.as_ref(), base64::URL_SAFE).map_err(serde::de::Error::custom) } } } @@ -302,7 +304,6 @@ mod test { } #[test] - #[should_panic(expected = "expected a borrowed string")] fn standard_base64_de_reader_success_cases() { let standard: Base64StandardWrapper = serde_json::from_reader(r#"{"bytes": "cVhabzk6U21uOkN+MylFWFRJMVFLdEh2MShmVHp9"}"#.as_bytes()).unwrap(); @@ -317,11 +318,10 @@ mod test { } #[test] - #[should_panic(expected = "expected a borrowed string")] fn urlsafe_base64_de_reader_success_cases() { - let url_safe: Base64URLSafeWrapper = + let wrapper: Base64URLSafeWrapper = serde_json::from_reader(r#"{"bytes": "aGVsbG8gd29ybGQ="}"#.as_bytes()).unwrap(); - assert_eq!(Some(b"hello world".as_slice()), url_safe.bytes.as_deref()); + assert_eq!(Some(b"hello world".as_slice()), wrapper.bytes.as_deref()); } #[test]