|
13 | 13 | for key in headers.keys() {
|
14 | 14 | let mut map_values = Vec::new();
|
15 | 15 | 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)?) |
17 | 17 | }
|
18 | 18 | map.serialize_entry(key.as_str(), &map_values)?;
|
19 | 19 | }
|
|
27 | 27 | {
|
28 | 28 | let mut map = serializer.serialize_map(Some(headers.keys_len()))?;
|
29 | 29 | 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)?; |
32 | 32 | }
|
33 | 33 | map.end()
|
34 | 34 | }
|
@@ -187,4 +187,42 @@ mod tests {
|
187 | 187 | let decoded: Test = serde_json::from_value(data).unwrap();
|
188 | 188 | assert!(decoded.headers.is_empty());
|
189 | 189 | }
|
| 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 | + } |
190 | 228 | }
|
0 commit comments