@@ -41,25 +41,41 @@ impl IsahcClient {
4141#[ async_trait]
4242impl HttpClient for IsahcClient {
4343 async fn send ( & self , mut req : Request ) -> Result < Response , Error > {
44- let mut builder = http:: Request :: builder ( )
45- . uri ( req. url ( ) . as_str ( ) )
46- . method ( http:: Method :: from_bytes ( req. method ( ) . to_string ( ) . as_bytes ( ) ) . unwrap ( ) ) ;
47-
48- for ( name, value) in req. iter ( ) {
49- builder = builder. header ( name. as_str ( ) , value. as_str ( ) ) ;
50- }
51-
5244 let body = req. take_body ( ) ;
53- let body = match body. len ( ) {
54- Some ( len) => isahc:: Body :: from_reader_sized ( body, len as u64 ) ,
55- None => isahc:: Body :: from_reader ( body) ,
56- } ;
5745
58- let request = builder. body ( body) . unwrap ( ) ;
59- let res = self . client . send_async ( request) . await . map_err ( Error :: from) ?;
60- let maybe_metrics = res. metrics ( ) . cloned ( ) ;
61- let ( parts, body) = res. into_parts ( ) ;
62- let body = Body :: from_reader ( BufReader :: new ( body) , None ) ;
46+ // Code duplication to get around https://github.com/http-rs/surf/issues/321
47+ // This is because `http::request` is generic (sized) over an existent and non-existent body differently, which is less than ideal.
48+ let ( parts, response_body, maybe_metrics) = match body. len ( ) {
49+ Some ( len) => {
50+ let mut builder = http:: Request :: builder ( )
51+ . uri ( req. url ( ) . as_str ( ) )
52+ . method ( http:: Method :: from_bytes ( req. method ( ) . to_string ( ) . as_bytes ( ) ) . unwrap ( ) ) ;
53+
54+ for ( name, value) in req. iter ( ) {
55+ builder = builder. header ( name. as_str ( ) , value. as_str ( ) ) ;
56+ }
57+ let body = isahc:: Body :: from_reader_sized ( body, len as u64 ) ;
58+ let request = builder. body ( body) . unwrap ( ) ;
59+ let res = self . client . send_async ( request) . await . map_err ( Error :: from) ?;
60+ let maybe_metrics = res. metrics ( ) . cloned ( ) ;
61+ let ( parts, body) = res. into_parts ( ) ;
62+ ( parts, Body :: from_reader ( BufReader :: new ( body) , None ) , maybe_metrics)
63+ }
64+ None => {
65+ let mut builder = http:: Request :: builder ( )
66+ . uri ( req. url ( ) . as_str ( ) )
67+ . method ( http:: Method :: from_bytes ( req. method ( ) . to_string ( ) . as_bytes ( ) ) . unwrap ( ) ) ;
68+
69+ for ( name, value) in req. iter ( ) {
70+ builder = builder. header ( name. as_str ( ) , value. as_str ( ) ) ;
71+ }
72+ let request = builder. body ( ( ) ) . unwrap ( ) ;
73+ let res = self . client . send_async ( request) . await . map_err ( Error :: from) ?;
74+ let maybe_metrics = res. metrics ( ) . cloned ( ) ;
75+ let ( parts, body) = res. into_parts ( ) ;
76+ ( parts, Body :: from_reader ( BufReader :: new ( body) , None ) , maybe_metrics)
77+ }
78+ } ;
6379 let mut response = http_types:: Response :: new ( parts. status . as_u16 ( ) ) ;
6480 for ( name, value) in & parts. headers {
6581 response. append_header ( name. as_str ( ) , value. to_str ( ) . unwrap ( ) ) ;
@@ -69,7 +85,7 @@ impl HttpClient for IsahcClient {
6985 response. ext_mut ( ) . insert ( metrics) ;
7086 }
7187
72- response. set_body ( body ) ;
88+ response. set_body ( response_body ) ;
7389 Ok ( response)
7490 }
7591
0 commit comments