@@ -15,9 +15,9 @@ use hyper::{
1515 Server ,
1616} ;
1717use log:: { error, info} ;
18- use shadowsocks:: { config:: ServerAddr , lookup_then} ;
18+ use shadowsocks:: { config:: ServerAddr , lookup_then, net :: TcpListener } ;
1919
20- use crate :: local:: { context:: ServiceContext , loadbalancing:: PingBalancer } ;
20+ use crate :: local:: { context:: ServiceContext , loadbalancing:: PingBalancer , LOCAL_DEFAULT_KEEPALIVE_TIMEOUT } ;
2121
2222use super :: { client_cache:: ProxyClientCache , connector:: BypassConnector , dispatcher:: HttpDispatcher } ;
2323
@@ -81,21 +81,40 @@ impl Http {
8181 } ) ;
8282
8383 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 ,
8585 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
8787 } )
8888 . map ( |( _, b) | b) ,
8989 } ;
9090
91- // HTTP Proxy protocol only defined in HTTP 1.x
9291 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+ }
99118 Err ( err) => {
100119 error ! ( "hyper server bind error: {}" , err) ;
101120 let err = io:: Error :: new ( ErrorKind :: InvalidInput , err) ;
0 commit comments