1
1
//! http-client implementation for async-h1.
2
2
3
- use super :: { Error , HttpClient , Request , Response } ;
3
+ use super :: { async_trait , Error , HttpClient , Request , Response } ;
4
4
5
5
use async_h1:: client;
6
- use futures:: future:: BoxFuture ;
7
6
use http_types:: StatusCode ;
8
7
9
8
/// Async-h1 based HTTP Client.
@@ -29,56 +28,55 @@ impl Clone for H1Client {
29
28
}
30
29
}
31
30
31
+ #[ async_trait]
32
32
impl HttpClient for H1Client {
33
- fn send ( & self , mut req : Request ) -> BoxFuture < ' static , Result < Response , Error > > {
34
- Box :: pin ( async move {
35
- // Insert host
36
- let host = req
37
- . url ( )
38
- . host_str ( )
39
- . ok_or_else ( || Error :: from_str ( StatusCode :: BadRequest , "missing hostname" ) ) ?
40
- . to_string ( ) ;
41
-
42
- let scheme = req. url ( ) . scheme ( ) ;
43
- if scheme != "http" && scheme != "https" {
44
- return Err ( Error :: from_str (
45
- StatusCode :: BadRequest ,
46
- format ! ( "invalid url scheme '{}'" , scheme) ,
47
- ) ) ;
33
+ async fn send ( & self , mut req : Request ) -> Result < Response , Error > {
34
+ // Insert host
35
+ let host = req
36
+ . url ( )
37
+ . host_str ( )
38
+ . ok_or_else ( || Error :: from_str ( StatusCode :: BadRequest , "missing hostname" ) ) ?
39
+ . to_string ( ) ;
40
+
41
+ let scheme = req. url ( ) . scheme ( ) ;
42
+ if scheme != "http" && scheme != "https" {
43
+ return Err ( Error :: from_str (
44
+ StatusCode :: BadRequest ,
45
+ format ! ( "invalid url scheme '{}'" , scheme) ,
46
+ ) ) ;
47
+ }
48
+
49
+ let addr = req
50
+ . url ( )
51
+ . socket_addrs ( || match req. url ( ) . scheme ( ) {
52
+ "http" => Some ( 80 ) ,
53
+ "https" => Some ( 443 ) ,
54
+ _ => None ,
55
+ } ) ?
56
+ . into_iter ( )
57
+ . next ( )
58
+ . ok_or_else ( || Error :: from_str ( StatusCode :: BadRequest , "missing valid address" ) ) ?;
59
+
60
+ log:: trace!( "> Scheme: {}" , scheme) ;
61
+
62
+ match scheme {
63
+ "http" => {
64
+ let stream = async_std:: net:: TcpStream :: connect ( addr) . await ?;
65
+ req. set_peer_addr ( stream. peer_addr ( ) . ok ( ) ) ;
66
+ req. set_local_addr ( stream. local_addr ( ) . ok ( ) ) ;
67
+ client:: connect ( stream, req) . await
48
68
}
69
+ "https" => {
70
+ let raw_stream = async_std:: net:: TcpStream :: connect ( addr) . await ?;
71
+ req. set_peer_addr ( raw_stream. peer_addr ( ) . ok ( ) ) ;
72
+ req. set_local_addr ( raw_stream. local_addr ( ) . ok ( ) ) ;
49
73
50
- let addr = req
51
- . url ( )
52
- . socket_addrs ( || match req. url ( ) . scheme ( ) {
53
- "http" => Some ( 80 ) ,
54
- "https" => Some ( 443 ) ,
55
- _ => None ,
56
- } ) ?
57
- . into_iter ( )
58
- . next ( )
59
- . ok_or_else ( || Error :: from_str ( StatusCode :: BadRequest , "missing valid address" ) ) ?;
60
-
61
- log:: trace!( "> Scheme: {}" , scheme) ;
62
-
63
- match scheme {
64
- "http" => {
65
- let stream = async_std:: net:: TcpStream :: connect ( addr) . await ?;
66
- req. set_peer_addr ( stream. peer_addr ( ) . ok ( ) ) ;
67
- req. set_local_addr ( stream. local_addr ( ) . ok ( ) ) ;
68
- client:: connect ( stream, req) . await
69
- }
70
- "https" => {
71
- let raw_stream = async_std:: net:: TcpStream :: connect ( addr) . await ?;
72
- req. set_peer_addr ( raw_stream. peer_addr ( ) . ok ( ) ) ;
73
- req. set_local_addr ( raw_stream. local_addr ( ) . ok ( ) ) ;
74
-
75
- let stream = async_native_tls:: connect ( host, raw_stream) . await ?;
76
-
77
- client:: connect ( stream, req) . await
78
- }
79
- _ => unreachable ! ( ) ,
74
+ let stream = async_native_tls:: connect ( host, raw_stream) . await ?;
75
+
76
+ client:: connect ( stream, req) . await
80
77
}
81
- } )
78
+ _ => unreachable ! ( ) ,
79
+ }
82
80
}
83
81
}
84
82
0 commit comments