@@ -11,17 +11,22 @@ use crate::handler::RuledHandler;
11
11
use crate :: server:: { TcpServer , UdpServer } ;
12
12
13
13
pub async fn run ( c : Config , closer : Arc < Notify > ) -> anyhow:: Result < ( ) > {
14
- let mut rb = RuledHandler :: builder ( ) ;
14
+ let addr = c . server . listen . parse :: < SocketAddr > ( ) ? ;
15
15
16
- for ( k , v ) in c . filters . iter ( ) {
17
- rb = rb . filter ( k , v ) ? ;
18
- }
16
+ // build rule handler
17
+ let h = {
18
+ let mut rb = RuledHandler :: builder ( ) ;
19
19
20
- for next in c. rules . iter ( ) {
21
- rb = rb. rule ( next ) ?;
22
- }
20
+ for ( k , v ) in c. filters . iter ( ) {
21
+ rb = rb. filter ( k , v ) ?;
22
+ }
23
23
24
- let h = rb. build ( ) ;
24
+ for next in c. rules . iter ( ) {
25
+ rb = rb. rule ( next) ?;
26
+ }
27
+
28
+ rb. build ( )
29
+ } ;
25
30
26
31
let cs = match & c. server . cache_size {
27
32
None => None ,
@@ -35,39 +40,39 @@ pub async fn run(c: Config, closer: Arc<Notify>) -> anyhow::Result<()> {
35
40
} ;
36
41
37
42
let udp_server = {
38
- let addr = socket2 :: SockAddr :: from ( c . server . listen . parse :: < SocketAddr > ( ) ? ) ;
39
- let socket = socket2:: Socket :: new ( Domain :: IPV4 , Type :: DGRAM , Some ( Protocol :: UDP ) ) ?;
43
+ let socket = {
44
+ let socket = socket2:: Socket :: new ( Domain :: IPV4 , Type :: DGRAM , Some ( Protocol :: UDP ) ) ?;
40
45
41
- // SO_REUSEADDR+SO_REUSEPORT
42
- if let Err ( e) = socket. set_reuse_address ( true ) {
43
- warn ! ( "failed to set SO_REUSEADDR for {:?}: {:?}" , & socket, e) ;
44
- }
45
- if let Err ( e) = socket. set_reuse_port ( true ) {
46
- warn ! ( "failed to set SO_REUSEPORT for {:?}: {:?}" , & socket, e) ;
47
- }
46
+ // SO_REUSEADDR+SO_REUSEPORT
47
+ if let Err ( e) = socket. set_reuse_address ( true ) {
48
+ warn ! ( "failed to set SO_REUSEADDR for {:?}: {:?}" , & socket, e) ;
49
+ }
50
+ if let Err ( e) = socket. set_reuse_port ( true ) {
51
+ warn ! ( "failed to set SO_REUSEPORT for {:?}: {:?}" , & socket, e) ;
52
+ }
48
53
49
- // enable balance for freebsd
50
- cfg_if ! {
51
- if #[ cfg( target_os="freebsd" ) ] {
52
- // SO_REUSEPORT_LB
53
- if let Err ( e) = socket. set_reuse_port_lb( true ) {
54
- warn!( "failed to set SO_REUSEPORT for {:?}: {:?}" , & socket, e) ;
54
+ // enable balance for freebsd
55
+ cfg_if ! {
56
+ if #[ cfg( target_os="freebsd" ) ] {
57
+ // SO_REUSEPORT_LB
58
+ if let Err ( e) = socket. set_reuse_port_lb( true ) {
59
+ warn!( "failed to set SO_REUSEPORT for {:?}: {:?}" , & socket, e) ;
60
+ }
55
61
}
56
62
}
57
- }
58
63
59
- socket. set_recv_buffer_size ( 4096 ) ?;
60
- socket. set_send_buffer_size ( 4096 ) ?;
61
- socket. set_nonblocking ( true ) ?;
64
+ socket. set_recv_buffer_size ( 4096 ) ?;
65
+ socket. set_send_buffer_size ( 4096 ) ?;
66
+ socket. set_nonblocking ( true ) ?;
62
67
63
- socket. bind ( & addr) ?;
68
+ let bind = socket2:: SockAddr :: from ( addr) ;
69
+ socket. bind ( & bind) ?;
64
70
65
- let socket = {
66
71
use std:: os:: fd:: { FromRawFd , IntoRawFd , RawFd } ;
67
72
let fd: RawFd = socket. into_raw_fd ( ) ;
68
73
let socket = unsafe { std:: net:: UdpSocket :: from_raw_fd ( fd) } ;
69
- UdpSocket :: from_std ( socket)
70
- } ? ;
74
+ UdpSocket :: from_std ( socket) ?
75
+ } ;
71
76
72
77
UdpServer :: new (
73
78
socket,
@@ -78,27 +83,32 @@ pub async fn run(c: Config, closer: Arc<Notify>) -> anyhow::Result<()> {
78
83
} ;
79
84
80
85
let tcp_server = {
81
- let addr = socket2:: SockAddr :: from ( c. server . listen . parse :: < SocketAddr > ( ) ?) ;
82
- let socket = socket2:: Socket :: new ( Domain :: IPV4 , Type :: STREAM , Some ( Protocol :: TCP ) ) ?;
86
+ let socket = {
87
+ let addr = socket2:: SockAddr :: from ( addr) ;
88
+ let socket = socket2:: Socket :: new ( Domain :: IPV4 , Type :: STREAM , Some ( Protocol :: TCP ) ) ?;
83
89
84
- // SO_REUSEADDR+SO_REUSEPORT
85
- if let Err ( e) = socket. set_reuse_address ( true ) {
86
- warn ! ( "failed to set SO_REUSEADDR for {:?}: {:?}" , & socket, e) ;
87
- }
88
- if let Err ( e) = socket. set_reuse_port ( true ) {
89
- warn ! ( "failed to set SO_REUSEPORT for {:?}: {:?}" , & socket, e) ;
90
- }
90
+ // SO_REUSEADDR+SO_REUSEPORT
91
+ if let Err ( e) = socket. set_reuse_address ( true ) {
92
+ warn ! ( "failed to set SO_REUSEADDR for {:?}: {:?}" , & socket, e) ;
93
+ }
94
+ if let Err ( e) = socket. set_reuse_port ( true ) {
95
+ warn ! ( "failed to set SO_REUSEPORT for {:?}: {:?}" , & socket, e) ;
96
+ }
97
+
98
+ socket. set_recv_buffer_size ( 4096 ) ?;
99
+ socket. set_send_buffer_size ( 4096 ) ?;
100
+ socket. set_nonblocking ( true ) ?;
101
+ socket. set_nodelay ( true ) ?;
91
102
92
- socket. set_recv_buffer_size ( 4096 ) ?;
93
- socket. set_send_buffer_size ( 4096 ) ?;
94
- socket. set_nonblocking ( true ) ?;
95
- socket. set_nodelay ( true ) ?;
103
+ socket. bind ( & addr) ?;
96
104
97
- socket. bind ( & addr ) ?;
105
+ socket. listen ( 65535 ) ?;
98
106
99
- socket. listen ( 65535 ) ?;
107
+ socket
108
+ } ;
100
109
101
110
TcpServer :: new (
111
+ addr,
102
112
TcpListener :: from_std ( socket. into ( ) ) ?,
103
113
Clone :: clone ( & h) ,
104
114
Clone :: clone ( & cs) ,
0 commit comments