1
- use std:: net:: { IpAddr , SocketAddr } ;
1
+ use std:: net:: SocketAddr ;
2
2
use std:: path:: PathBuf ;
3
3
use std:: sync:: Arc ;
4
4
use std:: time:: Duration ;
5
5
6
6
use hashbrown:: HashMap ;
7
7
use tokio:: sync:: { mpsc, Notify , RwLock } ;
8
8
9
- use capybara_core:: proto:: { Listener , Signal } ;
9
+ use capybara_core:: logger;
10
+ use capybara_core:: proto:: { Addr , Listener , Signal } ;
10
11
use capybara_core:: protocol:: http:: HttpListener ;
11
12
use capybara_core:: protocol:: stream:: StreamListener ;
12
13
use capybara_core:: transport:: tcp:: TcpStreamPoolBuilder ;
13
14
use capybara_core:: transport:: tls:: TlsStreamPoolBuilder ;
14
15
use capybara_core:: transport:: TlsAcceptorBuilder ;
15
- use capybara_core:: { CapybaraError , Pool , Pools , RoundRobinPools , WeightedPools } ;
16
+ use capybara_core:: { Pool , Pools , RoundRobinPools , WeightedPools } ;
16
17
use capybara_etc:: {
17
18
BalanceStrategy , Config , ListenerConfig , Properties , TransportKind , UpstreamConfig ,
18
19
} ;
@@ -66,15 +67,15 @@ impl Dispatcher {
66
67
67
68
let p = match endpoint. transport . as_ref ( ) . unwrap_or ( & v. transport ) {
68
69
TransportKind :: Tcp => {
70
+ let addr = endpoint. addr . parse :: < Addr > ( ) ?;
71
+ let closer = Clone :: clone ( & self . closer ) ;
69
72
if endpoint
70
73
. tls
71
74
. unwrap_or_else ( || endpoint. addr . ends_with ( ":443" ) )
72
75
{
73
- let b = to_tls_stream_pool_builder ( & endpoint. addr ) ?;
74
- Pool :: Tls ( b. build ( Clone :: clone ( & self . closer ) ) . await ?)
76
+ Pool :: Tls ( TlsStreamPoolBuilder :: new ( addr) . build ( closer) . await ?)
75
77
} else {
76
- let b = to_tcp_stream_pool_builder ( & endpoint. addr ) ?;
77
- Pool :: Tcp ( b. build ( Clone :: clone ( & self . closer ) ) . await ?)
78
+ Pool :: Tcp ( TcpStreamPoolBuilder :: new ( addr) . build ( closer) . await ?)
78
79
}
79
80
}
80
81
TransportKind :: Udp => {
@@ -92,17 +93,15 @@ impl Dispatcher {
92
93
for endpoint in & v. endpoints {
93
94
let pool = match endpoint. transport . unwrap_or ( v. transport ) {
94
95
TransportKind :: Tcp => {
96
+ let addr = endpoint. addr . parse :: < Addr > ( ) ?;
97
+ let closer = Clone :: clone ( & self . closer ) ;
95
98
if endpoint
96
99
. tls
97
100
. unwrap_or_else ( || endpoint. addr . ends_with ( ":443" ) )
98
101
{
99
- let b = to_tls_stream_pool_builder ( & endpoint. addr ) ?;
100
- let p = b. build ( Clone :: clone ( & self . closer ) ) . await ?;
101
- Pool :: Tls ( p)
102
+ Pool :: Tls ( TlsStreamPoolBuilder :: new ( addr) . build ( closer) . await ?)
102
103
} else {
103
- let b = to_tcp_stream_pool_builder ( & endpoint. addr ) ?;
104
- let p = b. build ( Clone :: clone ( & self . closer ) ) . await ?;
105
- Pool :: Tcp ( p)
104
+ Pool :: Tcp ( TcpStreamPoolBuilder :: new ( addr) . build ( closer) . await ?)
106
105
}
107
106
}
108
107
TransportKind :: Udp => {
@@ -254,48 +253,11 @@ impl Dispatcher {
254
253
}
255
254
}
256
255
257
- #[ inline]
258
- fn to_tls_stream_pool_builder ( addr : & str ) -> anyhow:: Result < TlsStreamPoolBuilder > {
259
- let mut sp = addr. split ( ':' ) ;
260
- if let Some ( left) = sp. next ( ) {
261
- if let Some ( right) = sp. next ( ) {
262
- if let Ok ( port) = right. parse :: < u16 > ( ) {
263
- if sp. next ( ) . is_none ( ) {
264
- return Ok ( match left. parse :: < IpAddr > ( ) {
265
- Ok ( ip) => TlsStreamPoolBuilder :: with_addr ( SocketAddr :: new ( ip, port) ) ,
266
- Err ( _) => TlsStreamPoolBuilder :: with_domain ( left, port) ,
267
- } ) ;
268
- }
269
- }
270
- }
271
- }
272
-
273
- bail ! ( CapybaraError :: InvalidUpstream ( addr. to_string( ) . into( ) ) ) ;
274
- }
275
-
276
- #[ inline]
277
- fn to_tcp_stream_pool_builder ( addr : & str ) -> anyhow:: Result < TcpStreamPoolBuilder > {
278
- let mut sp = addr. split ( ':' ) ;
279
- if let Some ( left) = sp. next ( ) {
280
- if let Some ( right) = sp. next ( ) {
281
- if let Ok ( port) = right. parse :: < u16 > ( ) {
282
- if sp. next ( ) . is_none ( ) {
283
- return Ok ( match left. parse :: < IpAddr > ( ) {
284
- Ok ( ip) => TcpStreamPoolBuilder :: with_addr ( SocketAddr :: new ( ip, port) ) ,
285
- Err ( _) => TcpStreamPoolBuilder :: with_domain ( left, port) ,
286
- } ) ;
287
- }
288
- }
289
- }
290
- }
291
-
292
- bail ! ( CapybaraError :: InvalidUpstream ( addr. to_string( ) . into( ) ) ) ;
293
- }
294
-
295
256
pub ( crate ) struct Bootstrap {
296
257
bc : BootstrapConf ,
297
258
c : Arc < RwLock < Config > > ,
298
259
dispatcher : Arc < RwLock < Dispatcher > > ,
260
+ loggers : Arc < RwLock < HashMap < String , logger:: Key > > > ,
299
261
}
300
262
301
263
impl Bootstrap {
@@ -304,9 +266,37 @@ impl Bootstrap {
304
266
w. shutdown ( ) . await ;
305
267
}
306
268
269
+ async fn generate_loggers ( & self ) -> anyhow:: Result < ( ) > {
270
+ let mut loggers: HashMap < String , logger:: Key > = Default :: default ( ) ;
271
+ let mut has_main = false ;
272
+ for ( k, v) in & self . bc . loggers {
273
+ if k == "main" {
274
+ has_main = true ;
275
+ logger:: init_global ( v) ?;
276
+ } else {
277
+ let lk = logger:: register ( v) ?;
278
+ loggers. insert ( Clone :: clone ( k) , lk) ;
279
+ }
280
+ }
281
+
282
+ // use default logger settings if no main logger found
283
+ if !has_main {
284
+ logger:: init_global ( & logger:: Config :: default ( ) ) ?;
285
+ }
286
+
287
+ // extend loggers
288
+ {
289
+ let mut w = self . loggers . write ( ) . await ;
290
+ w. extend ( loggers) ;
291
+ }
292
+
293
+ Ok ( ( ) )
294
+ }
295
+
307
296
pub ( crate ) async fn start ( & self ) -> anyhow:: Result < ( ) > {
308
- let ( c_tx , mut c_rx ) = mpsc :: unbounded_channel :: < Config > ( ) ;
297
+ self . generate_loggers ( ) . await ? ;
309
298
299
+ let ( c_tx, mut c_rx) = mpsc:: unbounded_channel :: < Config > ( ) ;
310
300
{
311
301
let dispatcher = Clone :: clone ( & self . dispatcher ) ;
312
302
let c = Clone :: clone ( & self . c ) ;
@@ -428,6 +418,7 @@ impl From<BootstrapConf> for Bootstrap {
428
418
bc : value,
429
419
c : Default :: default ( ) ,
430
420
dispatcher : Default :: default ( ) ,
421
+ loggers : Default :: default ( ) ,
431
422
}
432
423
}
433
424
}
0 commit comments