@@ -9,7 +9,7 @@ use std::cell::RefCell;
9
9
use std:: collections:: { VecDeque , HashMap } ;
10
10
use std:: fs:: File ;
11
11
use std:: io:: { self , BufReader } ;
12
- use std:: net;
12
+ use std:: net:: { self , SocketAddr } ;
13
13
use std:: rc:: Rc ;
14
14
use std:: time:: Duration ;
15
15
use tacho:: { self , Tacho } ;
@@ -21,12 +21,12 @@ mod admin_http;
21
21
mod sni;
22
22
pub mod config;
23
23
24
- use self :: config:: * ;
25
- use self :: sni:: Sni ;
26
24
use WeightedAddr ;
27
25
use lb:: { Balancer , Acceptor , Connector , PlainAcceptor , PlainConnector , SecureAcceptor ,
28
26
SecureConnector } ;
29
27
use namerd;
28
+ use self :: config:: * ;
29
+ use self :: sni:: Sni ;
30
30
31
31
const DEFAULT_BUFFER_SIZE : usize = 8 * 1024 ;
32
32
const DEFAULT_MAX_WAITERS : usize = 8 ;
@@ -95,7 +95,7 @@ pub fn configure(app: AppConfig) -> (Admin, Proxies) {
95
95
96
96
pub trait Loader : Sized {
97
97
type Run : Future < Item = ( ) , Error = io:: Error > ;
98
- fn load ( self , handle : Handle ) -> io:: Result < Self :: Run > ;
98
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Self :: Run ) > ;
99
99
}
100
100
pub trait Runner : Sized {
101
101
fn run ( self ) -> io:: Result < ( ) > ;
@@ -104,7 +104,7 @@ pub trait Runner: Sized {
104
104
impl < L : Loader > Runner for L {
105
105
fn run ( self ) -> io:: Result < ( ) > {
106
106
let mut core = Core :: new ( ) ?;
107
- let fut = self . load ( core. handle ( ) ) ?;
107
+ let ( _ , fut) = self . load ( core. handle ( ) ) ?;
108
108
core. run ( fut)
109
109
}
110
110
}
@@ -118,12 +118,12 @@ pub struct Admin {
118
118
}
119
119
impl Loader for Admin {
120
120
type Run = Running ;
121
- fn load ( self , handle : Handle ) -> io:: Result < Running > {
121
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
122
122
let mut running = Running :: new ( ) ;
123
123
{
124
124
let mut namerds = self . namerds ;
125
125
for _ in 0 ..namerds. len ( ) {
126
- let f = namerds. pop_front ( ) . unwrap ( ) . load ( handle. clone ( ) ) ?;
126
+ let ( _ , f ) = namerds. pop_front ( ) . unwrap ( ) . load ( handle. clone ( ) ) ?;
127
127
running. register ( f. map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ) ;
128
128
}
129
129
}
@@ -163,19 +163,19 @@ impl Loader for Admin {
163
163
} ) ;
164
164
running. register ( srv) ;
165
165
}
166
- Ok ( running)
166
+ Ok ( ( self . addr , running) )
167
167
}
168
168
}
169
169
170
170
171
- struct Namerd {
172
- config : NamerdConfig ,
173
- sender : mpsc:: Sender < Vec < WeightedAddr > > ,
174
- metrics : tacho:: Metrics ,
171
+ pub struct Namerd {
172
+ pub config : NamerdConfig ,
173
+ pub sender : mpsc:: Sender < Vec < WeightedAddr > > ,
174
+ pub metrics : tacho:: Metrics ,
175
175
}
176
176
impl Loader for Namerd {
177
177
type Run = Box < Future < Item = ( ) , Error = io:: Error > > ;
178
- fn load ( self , handle : Handle ) -> io:: Result < Self :: Run > {
178
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Self :: Run ) > {
179
179
let path = self . config . path ;
180
180
let url = self . config . url ;
181
181
let interval_secs = self . config . interval_secs . unwrap_or ( DEFAULT_NAMERD_SECONDS ) ;
@@ -194,7 +194,8 @@ impl Loader for Namerd {
194
194
let sink = self . sender . sink_map_err ( |_| error ! ( "sink error" ) ) ;
195
195
addrs. forward ( sink) . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) . map ( |_| { } )
196
196
} ;
197
- Ok ( Box :: new ( driver) )
197
+ // FIXME: 127.0.0.1:0 is a hideous hack but I lost the ability to get a SocketAddr.
198
+ Ok ( ( "127.0.0.1:0" . parse ( ) . unwrap ( ) , Box :: new ( driver) ) )
198
199
}
199
200
}
200
201
@@ -203,29 +204,32 @@ pub struct Proxies {
203
204
}
204
205
impl Loader for Proxies {
205
206
type Run = Running ;
206
- fn load ( self , handle : Handle ) -> io:: Result < Running > {
207
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
207
208
let mut running = Running :: new ( ) ;
208
209
let mut proxies = self . proxies ;
210
+ let mut addr: SocketAddr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
209
211
for _ in 0 ..proxies. len ( ) {
210
212
let p = proxies. pop_front ( ) . unwrap ( ) ;
211
- let f = p. load ( handle. clone ( ) ) ?;
213
+ let ( _addr, f) = p. load ( handle. clone ( ) ) ?;
214
+ addr = _addr;
212
215
running. register ( f) ;
213
216
}
214
- Ok ( running)
217
+ Ok ( ( addr , running) )
215
218
}
216
219
}
217
220
218
- struct Proxy {
219
- client : Option < ClientConfig > ,
220
- server : ProxyServer ,
221
+ pub struct Proxy {
222
+ pub client : Option < ClientConfig > ,
223
+ pub server : ProxyServer ,
221
224
}
222
225
impl Loader for Proxy {
223
226
type Run = Running ;
224
- fn load ( self , handle : Handle ) -> io:: Result < Running > {
227
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
225
228
match self . client . and_then ( |c| c. tls ) {
226
229
None => {
227
230
let conn = PlainConnector :: new ( handle. clone ( ) ) ;
228
- self . server . load ( & handle, conn)
231
+ let f = self . server . load ( & handle, conn) . expect ( "b" ) ;
232
+ Ok ( f)
229
233
}
230
234
Some ( ref c) => {
231
235
let mut tls = rustls:: ClientConfig :: new ( ) ;
@@ -238,29 +242,33 @@ impl Loader for Proxy {
238
242
}
239
243
} ;
240
244
let conn = SecureConnector :: new ( c. dns_name . clone ( ) , tls, handle. clone ( ) ) ;
241
- self . server . load ( & handle, conn)
245
+ let f = self . server . load ( & handle, conn) . expect ( "a" ) ;
246
+ Ok ( f)
242
247
}
243
248
}
244
249
}
245
250
}
246
251
247
- struct ProxyServer {
248
- label : String ,
249
- servers : Vec < ServerConfig > ,
250
- addrs : Box < Stream < Item = Vec < WeightedAddr > , Error = ( ) > > ,
251
- buf : Rc < RefCell < Vec < u8 > > > ,
252
- max_waiters : usize ,
253
- metrics : tacho:: Metrics ,
252
+ pub struct ProxyServer {
253
+ pub label : String ,
254
+ pub servers : Vec < ServerConfig > ,
255
+ pub addrs : Box < Stream < Item = Vec < WeightedAddr > , Error = ( ) > > ,
256
+ pub buf : Rc < RefCell < Vec < u8 > > > ,
257
+ pub max_waiters : usize ,
258
+ pub metrics : tacho:: Metrics ,
254
259
}
255
260
impl ProxyServer {
256
- fn load < C > ( self , handle : & Handle , conn : C ) -> io:: Result < Running >
261
+ fn load < C > ( self , handle : & Handle , conn : C ) -> io:: Result < ( SocketAddr , Running ) >
257
262
where C : Connector + ' static
258
263
{
259
264
let addrs = self . addrs . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ;
260
265
let metrics = self . metrics . clone ( ) . labeled ( "proxy" . into ( ) , self . label . into ( ) ) ;
261
266
let bal = Balancer :: new ( addrs, conn, self . buf . clone ( ) , metrics. clone ( ) )
262
267
. into_shared ( self . max_waiters , handle. clone ( ) ) ;
263
268
269
+ // Placeholder for our local listening SocketAddr.
270
+ let mut local_addr: SocketAddr = "127.0.0.1:0" . parse ( ) . expect ( "unable to parse addr" ) ;
271
+
264
272
// TODO scope/tag stats for servers.
265
273
266
274
let mut running = Running :: new ( ) ;
@@ -271,7 +279,9 @@ impl ProxyServer {
271
279
ServerConfig :: Tcp { ref addr } => {
272
280
let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
273
281
let acceptor = PlainAcceptor :: new ( handle, metrics) ;
274
- let f = acceptor. accept ( addr) . forward ( bal) . map ( |_| { } ) ;
282
+ let ( bound_addr, forwarder) = acceptor. accept ( addr) ;
283
+ local_addr = bound_addr;
284
+ let f = forwarder. forward ( bal) . map ( |_| { } ) ;
275
285
running. register ( f) ;
276
286
}
277
287
ServerConfig :: Tls { ref addr,
@@ -287,12 +297,14 @@ impl ProxyServer {
287
297
288
298
let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
289
299
let acceptor = SecureAcceptor :: new ( handle, tls, metrics) ;
290
- let f = acceptor. accept ( addr) . forward ( bal) . map ( |_| { } ) ;
300
+ let ( bound_addr, forwarder) = acceptor. accept ( addr) ;
301
+ local_addr = bound_addr;
302
+ let f = forwarder. forward ( bal) . map ( |_| { } ) ;
291
303
running. register ( f) ;
292
304
}
293
305
}
294
306
}
295
- Ok ( running)
307
+ Ok ( ( local_addr , running) )
296
308
}
297
309
}
298
310
0 commit comments