1
1
//! HTTP client
2
2
3
- use hyper:: { http, Client , Request } ;
3
+ use hyper:: { http, rt , Client , Request } ;
4
4
use futures:: { Future , Stream } ;
5
5
6
6
use crate :: { RpcChannel , RpcError } ;
7
7
use super :: request_response;
8
8
9
9
/// Create a HTTP Client
10
- pub fn http < TClient > ( url : & str ) -> impl Future < Item =TClient , Error =( ) >
10
+ pub fn http < TClient > ( url : & str ) -> impl Future < Item =TClient , Error =RpcError >
11
11
where
12
12
TClient : From < RpcChannel > ,
13
13
{
32
32
} )
33
33
} ) ;
34
34
35
- rpc_client
36
- . map_err ( |e| log:: error!( "RPC Client error: {:?}" , e) )
37
- . map ( |( ) | TClient :: from ( sender) )
35
+ rt:: lazy ( move || {
36
+ rt:: spawn ( rpc_client. map_err ( |e| log:: error!( "RPC Client error: {:?}" , e) ) ) ;
37
+ Ok ( TClient :: from ( sender) )
38
+ } )
38
39
}
39
40
40
41
#[ cfg( test) ]
@@ -44,6 +45,7 @@ mod tests {
44
45
use hyper:: rt;
45
46
use super :: * ;
46
47
use crate :: * ;
48
+ use std:: time:: Duration ;
47
49
48
50
fn id < T > ( t : T ) -> T {
49
51
t
@@ -91,20 +93,26 @@ mod tests {
91
93
// given
92
94
let _server = serve ( id) ;
93
95
96
+ let ( tx, rx) = std:: sync:: mpsc:: channel ( ) ;
94
97
let uri = "http://localhost:3030" ;
98
+
99
+ // when
95
100
let run =
96
101
http ( uri)
97
102
. and_then ( |client : TestClient | {
98
103
client. hello ( "http" )
99
- . then ( |result| {
100
- assert_eq ! ( result. unwrap( ) , "hello http" ) ;
104
+ . and_then ( move |result| {
101
105
drop ( client) ;
106
+ let _ = tx. send ( result) ;
102
107
Ok ( ( ) )
103
108
} )
104
- } ) ;
109
+ } )
110
+ . map_err ( |e| log:: error!( "RPC Client error: {:?}" , e) ) ;
105
111
106
112
rt:: run ( run) ;
107
113
108
- assert ! ( false ) ;
114
+ // then
115
+ let result = rx. recv_timeout ( Duration :: from_secs ( 3 ) ) . unwrap ( ) ;
116
+ assert_eq ! ( "hello http" , result) ;
109
117
}
110
118
}
0 commit comments