1
- use futures:: { try_ready , Async , Future , Poll } ;
1
+ use futures:: { Async , Future , Poll } ;
2
2
use state_machine_future:: { transition, RentToOwn , StateMachineFuture } ;
3
3
4
4
use crate :: proto:: { Client , ConnectOnceFuture , Connection } ;
@@ -9,19 +9,12 @@ pub enum Connect<T>
9
9
where
10
10
T : MakeTlsMode < Socket > ,
11
11
{
12
- #[ state_machine_future( start, transitions( MakingTlsMode ) ) ]
12
+ #[ state_machine_future( start, transitions( Connecting ) ) ]
13
13
Start {
14
14
make_tls_mode : T ,
15
15
config : Result < Config , Error > ,
16
16
} ,
17
- #[ state_machine_future( transitions( Connecting ) ) ]
18
- MakingTlsMode {
19
- future : T :: Future ,
20
- idx : usize ,
21
- make_tls_mode : T ,
22
- config : Config ,
23
- } ,
24
- #[ state_machine_future( transitions( MakingTlsMode , Finished ) ) ]
17
+ #[ state_machine_future( transitions( Finished ) ) ]
25
18
Connecting {
26
19
future : ConnectOnceFuture < T :: TlsMode > ,
27
20
idx : usize ,
@@ -57,58 +50,48 @@ where
57
50
#[ cfg( unix) ]
58
51
Host :: Unix ( _) => "" ,
59
52
} ;
60
- let future = state. make_tls_mode . make_tls_mode ( hostname) ;
53
+ let tls_mode = state
54
+ . make_tls_mode
55
+ . make_tls_mode ( hostname)
56
+ . map_err ( |e| Error :: tls ( e. into ( ) ) ) ?;
61
57
62
- transition ! ( MakingTlsMode {
63
- future,
58
+ transition ! ( Connecting {
59
+ future: ConnectOnceFuture :: new ( 0 , tls_mode , config . clone ( ) ) ,
64
60
idx: 0 ,
65
61
make_tls_mode: state. make_tls_mode,
66
62
config,
67
63
} )
68
64
}
69
65
70
- fn poll_making_tls_mode < ' a > (
71
- state : & ' a mut RentToOwn < ' a , MakingTlsMode < T > > ,
72
- ) -> Poll < AfterMakingTlsMode < T > , Error > {
73
- let tls_mode = try_ready ! ( state. future. poll( ) . map_err( |e| Error :: tls( e. into( ) ) ) ) ;
74
- let state = state. take ( ) ;
75
-
76
- transition ! ( Connecting {
77
- future: ConnectOnceFuture :: new( state. idx, tls_mode, state. config. clone( ) ) ,
78
- idx: state. idx,
79
- make_tls_mode: state. make_tls_mode,
80
- config: state. config,
81
- } )
82
- }
83
-
84
66
fn poll_connecting < ' a > (
85
67
state : & ' a mut RentToOwn < ' a , Connecting < T > > ,
86
68
) -> Poll < AfterConnecting < T > , Error > {
87
- match state. future . poll ( ) {
88
- Ok ( Async :: Ready ( r) ) => transition ! ( Finished ( r) ) ,
89
- Ok ( Async :: NotReady ) => Ok ( Async :: NotReady ) ,
90
- Err ( e) => {
91
- let mut state = state. take ( ) ;
92
- let idx = state. idx + 1 ;
69
+ loop {
70
+ match state. future . poll ( ) {
71
+ Ok ( Async :: Ready ( r) ) => transition ! ( Finished ( r) ) ,
72
+ Ok ( Async :: NotReady ) => return Ok ( Async :: NotReady ) ,
73
+ Err ( e) => {
74
+ let state = & mut * * state;
75
+ state. idx += 1 ;
93
76
94
- let host = match state. config . 0 . host . get ( idx) {
95
- Some ( host) => host,
96
- None => return Err ( e) ,
97
- } ;
77
+ let host = match state. config . 0 . host . get ( state . idx ) {
78
+ Some ( host) => host,
79
+ None => return Err ( e) ,
80
+ } ;
98
81
99
- let hostname = match host {
100
- Host :: Tcp ( host) => & * * host,
101
- #[ cfg( unix) ]
102
- Host :: Unix ( _) => "" ,
103
- } ;
104
- let future = state. make_tls_mode . make_tls_mode ( hostname) ;
82
+ let hostname = match host {
83
+ Host :: Tcp ( host) => & * * host,
84
+ #[ cfg( unix) ]
85
+ Host :: Unix ( _) => "" ,
86
+ } ;
87
+ let tls_mode = state
88
+ . make_tls_mode
89
+ . make_tls_mode ( hostname)
90
+ . map_err ( |e| Error :: tls ( e. into ( ) ) ) ?;
105
91
106
- transition ! ( MakingTlsMode {
107
- future,
108
- idx,
109
- make_tls_mode: state. make_tls_mode,
110
- config: state. config,
111
- } )
92
+ state. future =
93
+ ConnectOnceFuture :: new ( state. idx , tls_mode, state. config . clone ( ) ) ;
94
+ }
112
95
}
113
96
}
114
97
}
0 commit comments