@@ -15,9 +15,9 @@ use hyper::{
15
15
Server ,
16
16
} ;
17
17
use log:: { error, info} ;
18
- use shadowsocks:: { config:: ServerAddr , lookup_then} ;
18
+ use shadowsocks:: { config:: ServerAddr , lookup_then, net :: TcpListener } ;
19
19
20
- use crate :: local:: { context:: ServiceContext , loadbalancing:: PingBalancer } ;
20
+ use crate :: local:: { context:: ServiceContext , loadbalancing:: PingBalancer , LOCAL_DEFAULT_KEEPALIVE_TIMEOUT } ;
21
21
22
22
use super :: { client_cache:: ProxyClientCache , connector:: BypassConnector , dispatcher:: HttpDispatcher } ;
23
23
@@ -81,21 +81,40 @@ impl Http {
81
81
} ) ;
82
82
83
83
let bind_result = match * client_config {
84
- ServerAddr :: SocketAddr ( sa) => Server :: try_bind ( & sa) ,
84
+ ServerAddr :: SocketAddr ( sa) => TcpListener :: bind_with_opts ( & sa, self . context . accept_opts ( ) . clone ( ) ) . await ,
85
85
ServerAddr :: DomainName ( ref dname, port) => lookup_then ! ( self . context. context_ref( ) , dname, port, |addr| {
86
- Server :: try_bind ( & addr)
86
+ TcpListener :: bind_with_opts ( & addr, self . context . accept_opts ( ) . clone ( ) ) . await
87
87
} )
88
88
. map ( |( _, b) | b) ,
89
89
} ;
90
90
91
- // HTTP Proxy protocol only defined in HTTP 1.x
92
91
let server = match bind_result {
93
- Ok ( builder) => builder
94
- . http1_only ( true )
95
- . http1_preserve_header_case ( true )
96
- . http1_title_case_headers ( true )
97
- . tcp_sleep_on_accept_errors ( true )
98
- . serve ( make_service) ,
92
+ Ok ( listener) => {
93
+ let listener = listener. into_inner ( ) . into_std ( ) ?;
94
+ let builder = match Server :: from_tcp ( listener) {
95
+ Ok ( builder) => builder,
96
+ Err ( err) => {
97
+ error ! ( "hyper server from std::net::TcpListener error: {}" , err) ;
98
+ let err = io:: Error :: new ( ErrorKind :: InvalidInput , err) ;
99
+ return Err ( err) ;
100
+ }
101
+ } ;
102
+
103
+ builder
104
+ . http1_only ( true ) // HTTP Proxy protocol only defined in HTTP 1.x
105
+ . http1_preserve_header_case ( true )
106
+ . http1_title_case_headers ( true )
107
+ . tcp_sleep_on_accept_errors ( true )
108
+ . tcp_keepalive (
109
+ self . context
110
+ . accept_opts ( )
111
+ . tcp
112
+ . keepalive
113
+ . or ( Some ( LOCAL_DEFAULT_KEEPALIVE_TIMEOUT ) ) ,
114
+ )
115
+ . tcp_nodelay ( self . context . accept_opts ( ) . tcp . nodelay )
116
+ . serve ( make_service)
117
+ }
99
118
Err ( err) => {
100
119
error ! ( "hyper server bind error: {}" , err) ;
101
120
let err = io:: Error :: new ( ErrorKind :: InvalidInput , err) ;
0 commit comments