From b129ab0bb4859ecb626828b9b6f28d7076db8134 Mon Sep 17 00:00:00 2001 From: Shou Ya Date: Wed, 9 Jan 2019 13:01:52 +0800 Subject: [PATCH] fix multipart with unicode filename (#420) --- src/async_impl/multipart.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/async_impl/multipart.rs b/src/async_impl/multipart.rs index 58543b6..4455f12 100644 --- a/src/async_impl/multipart.rs +++ b/src/async_impl/multipart.rs @@ -397,7 +397,7 @@ impl PercentEncoding { "Content-Disposition: form-data; {}{}{}", self.format_parameter("name", name), match field.file_name { - Some(ref file_name) => format!("; {}", self.format_parameter("filename", file_name)), + Some(ref file_name) => format!("; {}", self.format_filename(file_name)), None => String::new(), }, match field.mime { @@ -414,6 +414,16 @@ impl PercentEncoding { }) } + // According to RFC7578 Section 4.2, `filename*=` syntax is invalid. + // See https://github.com/seanmonstar/reqwest/issues/419. + fn format_filename(&self, filename: &str) -> String { + let legal_filename = filename.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\r", "\\\r") + .replace("\n", "\\\n"); + format!("filename=\"{}\"", legal_filename) + } + fn format_parameter(&self, name: &str, value: &str) -> String { let legal_value = match *self { PercentEncoding::PathSegment => {