From efd784353e515fe5afcc32eac7730381c2f7146c Mon Sep 17 00:00:00 2001 From: Bruce Weirdan Date: Sun, 4 Aug 2024 14:37:51 +0200 Subject: [PATCH] Fixed part headers formatting and added `Content-Length` --- crates/nu-command/src/network/http/client.rs | 22 +++++++++++-------- .../tests/commands/network/http/post.rs | 7 +++--- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/crates/nu-command/src/network/http/client.rs b/crates/nu-command/src/network/http/client.rs index 4de40c92d6..7bb63a8fbd 100644 --- a/crates/nu-command/src/network/http/client.rs +++ b/crates/nu-command/src/network/http/client.rs @@ -281,17 +281,21 @@ pub fn send_request( for (col, val) in val.into_owned() { if let Value::Binary { val, .. } = val { - let headers = format!( - r#"Content-Type: application/octet-stream - Content-Disposition: form-data; name="{}"; filename="{}" - Content-Transfer-Encoding: binary - "#, - col, col, - ); - builder.add(&mut Cursor::new(val), &headers).map_err(err)?; + let headers = [ + "Content-Type: application/octet-stream".to_string(), + "Content-Transfer-Encoding: binary".to_string(), + format!( + "Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"", + col, col + ), + format!("Content-Length: {}", val.len()), + ]; + builder + .add(&mut Cursor::new(val), &headers.join("\n")) + .map_err(err)?; } else { let headers = - format!(r#"Content-Disposition: form-data; name="{}""#, col,); + format!(r#"Content-Disposition: form-data; name="{}""#, col); builder .add(val.coerce_into_string()?.as_bytes(), &headers) .map_err(err)?; diff --git a/crates/nu-command/tests/commands/network/http/post.rs b/crates/nu-command/tests/commands/network/http/post.rs index 66ac2f029c..11db87168e 100644 --- a/crates/nu-command/tests/commands/network/http/post.rs +++ b/crates/nu-command/tests/commands/network/http/post.rs @@ -210,9 +210,10 @@ fn http_post_multipart_is_success() { Matcher::Regex("multipart/form-data; boundary=.*".to_string()), ) .match_body(Matcher::AllOf(vec![ - Matcher::Regex(r#"Content-Disposition: form-data; name="foo""#.to_string()), - Matcher::Regex(r#"Content-Type: application/octet-stream"#.to_string()), - Matcher::Regex(r#"bar"#.to_string()), + Matcher::Regex(r#"(?m)^Content-Disposition: form-data; name="foo""#.to_string()), + Matcher::Regex(r#"(?m)^Content-Type: application/octet-stream"#.to_string()), + Matcher::Regex(r#"(?m)^Content-Length: 3"#.to_string()), + Matcher::Regex(r#"(?m)^bar"#.to_string()), ])) .with_status(200) .create();