@@ -41,25 +41,41 @@ impl IsahcClient {
41
41
#[ async_trait]
42
42
impl HttpClient for IsahcClient {
43
43
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
-
52
44
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
- } ;
57
45
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
+ } ;
63
79
let mut response = http_types:: Response :: new ( parts. status . as_u16 ( ) ) ;
64
80
for ( name, value) in & parts. headers {
65
81
response. append_header ( name. as_str ( ) , value. to_str ( ) . unwrap ( ) ) ;
@@ -69,7 +85,7 @@ impl HttpClient for IsahcClient {
69
85
response. ext_mut ( ) . insert ( metrics) ;
70
86
}
71
87
72
- response. set_body ( body ) ;
88
+ response. set_body ( response_body ) ;
73
89
Ok ( response)
74
90
}
75
91
0 commit comments