Skip to content

Commit 2652b45

Browse files
authored
Support serialize UTF-8 String in HTTP Header Values (#800)
* Support serialize UTF-8 String in HTTP Header Values * Fix issues in http-axum example * Revert "Fix issues in http-axum example" This reverts commit 77ad45a. * Add a unit test * Add a unit test to cover both 'serialize_headers' and 'serialize_multi_value_headers'
1 parent 42e4dfc commit 2652b45

File tree

1 file changed

+41
-3
lines changed

1 file changed

+41
-3
lines changed

lambda-events/src/custom_serde/headers.rs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ where
1313
for key in headers.keys() {
1414
let mut map_values = Vec::new();
1515
for value in headers.get_all(key) {
16-
map_values.push(value.to_str().map_err(S::Error::custom)?)
16+
map_values.push(String::from_utf8(value.as_bytes().to_vec()).map_err(S::Error::custom)?)
1717
}
1818
map.serialize_entry(key.as_str(), &map_values)?;
1919
}
@@ -27,8 +27,8 @@ where
2727
{
2828
let mut map = serializer.serialize_map(Some(headers.keys_len()))?;
2929
for key in headers.keys() {
30-
let map_value = headers[key].to_str().map_err(S::Error::custom)?;
31-
map.serialize_entry(key.as_str(), map_value)?;
30+
let map_value = String::from_utf8(headers[key].as_bytes().to_vec()).map_err(S::Error::custom)?;
31+
map.serialize_entry(key.as_str(), &map_value)?;
3232
}
3333
map.end()
3434
}
@@ -187,4 +187,42 @@ mod tests {
187187
let decoded: Test = serde_json::from_value(data).unwrap();
188188
assert!(decoded.headers.is_empty());
189189
}
190+
191+
#[test]
192+
fn test_serialize_utf8_headers() {
193+
#[derive(Deserialize, Serialize)]
194+
struct Test {
195+
#[serde(deserialize_with = "deserialize_headers", default)]
196+
#[serde(serialize_with = "serialize_headers")]
197+
pub headers: HeaderMap,
198+
#[serde(deserialize_with = "deserialize_headers", default)]
199+
#[serde(serialize_with = "serialize_multi_value_headers")]
200+
pub multi_value_headers: HeaderMap,
201+
}
202+
203+
let content_disposition =
204+
"inline; filename=\"Schillers schönste Szenenanweisungen -Kabale und Liebe.mp4.avif\"";
205+
let data = serde_json::json!({
206+
"headers": {
207+
"Content-Disposition": content_disposition
208+
},
209+
"multi_value_headers": {
210+
"Content-Disposition": content_disposition
211+
}
212+
});
213+
let decoded: Test = serde_json::from_value(data).unwrap();
214+
assert_eq!(content_disposition, decoded.headers.get("Content-Disposition").unwrap());
215+
assert_eq!(
216+
content_disposition,
217+
decoded.multi_value_headers.get("Content-Disposition").unwrap()
218+
);
219+
220+
let recoded = serde_json::to_value(decoded).unwrap();
221+
let decoded: Test = serde_json::from_value(recoded).unwrap();
222+
assert_eq!(content_disposition, decoded.headers.get("Content-Disposition").unwrap());
223+
assert_eq!(
224+
content_disposition,
225+
decoded.multi_value_headers.get("Content-Disposition").unwrap()
226+
);
227+
}
190228
}

0 commit comments

Comments
 (0)