@@ -386,11 +386,23 @@ pub fn encode_path(pc: &str) -> String {
386386}
387387
388388#[ doc( hidden) ]
389- pub trait RequestBuilderExt < E > {
389+ pub trait RequestBuilderExt < E >
390+ where
391+ Self : Sized ,
392+ {
390393 fn form_urlencoded < T : Serialize + ?Sized > (
391394 self ,
392395 body : & T ,
393396 ) -> Result < RequestBuilder , Error < E > > ;
397+
398+ fn form_from_raw <
399+ S : AsRef < str > ,
400+ T : AsRef < [ u8 ] > ,
401+ I : Sized + IntoIterator < Item = ( S , T ) > ,
402+ > (
403+ self ,
404+ iter : I ,
405+ ) -> Result < Self , Error < E > > ;
394406}
395407
396408impl < E > RequestBuilderExt < E > for RequestBuilder {
@@ -405,8 +417,37 @@ impl<E> RequestBuilderExt<E> for RequestBuilder {
405417 "application/x-www-form-urlencoded" ,
406418 ) ,
407419 )
408- . body ( serde_urlencoded:: to_string ( body) . map_err ( |_| {
409- Error :: InvalidRequest ( "failed to serialize body" . to_string ( ) )
420+ . body ( serde_urlencoded:: to_string ( body) . map_err ( |e| {
421+ Error :: InvalidRequest ( format ! (
422+ "failed to serialize body: {e:?}"
423+ ) )
410424 } ) ?) )
411425 }
426+
427+ fn form_from_raw <
428+ S : AsRef < str > ,
429+ T : AsRef < [ u8 ] > ,
430+ I : Sized + IntoIterator < Item = ( S , T ) > ,
431+ > (
432+ self ,
433+ mut iter : I ,
434+ ) -> Result < Self , Error < E > > {
435+ use reqwest:: multipart:: { Form , Part } ;
436+
437+ let mut form = Form :: new ( ) ;
438+ for ( name, value) in iter {
439+ form = form. part (
440+ name. as_ref ( ) . to_owned ( ) ,
441+ Part :: stream ( Vec :: from ( value. as_ref ( ) ) ) ,
442+ ) ;
443+ }
444+ Ok ( self
445+ . header (
446+ reqwest:: header:: CONTENT_TYPE ,
447+ reqwest:: header:: HeaderValue :: from_static (
448+ "multipart/form-data" ,
449+ ) ,
450+ )
451+ . multipart ( form) )
452+ }
412453}
0 commit comments