From b16ea79e28a0c299cbb95f7b806135ab9b875222 Mon Sep 17 00:00:00 2001 From: Valentin Bersier Date: Tue, 3 Jan 2023 15:54:23 +0100 Subject: [PATCH] Add public interface to Multipart's Part `headers` (#1687) * feat(async_impl): set custom headers on multipart Part * feat(blocking): set custom headers on multipart * test(multipart): use new method to add custom headers * fix: missing import * refactor(multipart): use concrete type for headers setter arg --- src/async_impl/multipart.rs | 19 +++++++++++++++++-- src/blocking/multipart.rs | 10 +++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/async_impl/multipart.rs b/src/async_impl/multipart.rs index 4573dd904..1c4d43da5 100644 --- a/src/async_impl/multipart.rs +++ b/src/async_impl/multipart.rs @@ -4,7 +4,6 @@ use std::fmt; use std::pin::Pin; use bytes::Bytes; -use http::HeaderMap; use mime_guess::Mime; use percent_encoding::{self, AsciiSet, NON_ALPHANUMERIC}; @@ -12,6 +11,7 @@ use futures_core::Stream; use futures_util::{future, stream, StreamExt}; use super::Body; +use crate::header::HeaderMap; /// An async multipart/form-data request. pub struct Form { @@ -244,6 +244,11 @@ impl Part { self.with_inner(move |inner| inner.file_name(filename)) } + /// Sets custom headers for the part. + pub fn headers(self, headers: HeaderMap) -> Part { + self.with_inner(move |inner| inner.headers(headers)) + } + fn with_inner(self, func: F) -> Self where F: FnOnce(PartMetadata) -> PartMetadata, @@ -394,6 +399,14 @@ impl PartMetadata { self.file_name = Some(filename.into()); self } + + pub(crate) fn headers(mut self, headers: T) -> Self + where + T: Into, + { + self.headers = headers.into(); + self + } } impl PartMetadata { @@ -591,7 +604,9 @@ mod tests { #[test] fn stream_to_end_with_header() { let mut part = Part::text("value2").mime(mime::IMAGE_BMP); - part.meta.headers.insert("Hdr3", "/a/b/c".parse().unwrap()); + let mut headers = HeaderMap::new(); + headers.insert("Hdr3", "/a/b/c".parse().unwrap()); + part = part.headers(headers); let mut form = Form::new().part("key2", part); form.inner.boundary = "boundary".to_string(); let expected = "--boundary\r\n\ diff --git a/src/blocking/multipart.rs b/src/blocking/multipart.rs index d94e139a4..9e7dfd3c7 100644 --- a/src/blocking/multipart.rs +++ b/src/blocking/multipart.rs @@ -46,6 +46,7 @@ use mime_guess::{self, Mime}; use super::Body; use crate::async_impl::multipart::{FormParts, PartMetadata, PartProps}; +use crate::header::HeaderMap; /// A multipart/form-data request. pub struct Form { @@ -256,6 +257,11 @@ impl Part { self.with_inner(move |inner| inner.file_name(filename)) } + /// Sets custom headers for the part. + pub fn headers(self, headers: HeaderMap) -> Part { + self.with_inner(move |inner| inner.headers(headers)) + } + fn with_inner(self, func: F) -> Self where F: FnOnce(PartMetadata) -> PartMetadata, @@ -453,7 +459,9 @@ mod tests { fn read_to_end_with_header() { let mut output = Vec::new(); let mut part = Part::text("value2").mime(mime::IMAGE_BMP); - part.meta.headers.insert("Hdr3", "/a/b/c".parse().unwrap()); + let mut headers = HeaderMap::new(); + headers.insert("Hdr3", "/a/b/c".parse().unwrap()); + part = part.headers(headers); let mut form = Form::new().part("key2", part); form.inner.boundary = "boundary".to_string(); let expected = "--boundary\r\n\