@@ -4,6 +4,9 @@ use std::net::{SocketAddr, TcpListener as StdTcpListener};
4
4
use std:: time:: Duration ;
5
5
use socket2:: TcpKeepalive ;
6
6
7
+ #[ cfg( target_os = "wasi" ) ]
8
+ use std:: net:: { IpAddr , Ipv4Addr } ;
9
+
7
10
use tokio:: net:: TcpListener ;
8
11
use tokio:: time:: Sleep ;
9
12
use tracing:: { debug, error, trace} ;
@@ -78,6 +81,7 @@ pub struct AddrIncoming {
78
81
}
79
82
80
83
impl AddrIncoming {
84
+ #[ cfg( not( target_os = "wasi" ) ) ]
81
85
pub ( super ) fn new ( addr : & SocketAddr ) -> crate :: Result < Self > {
82
86
let std_listener = StdTcpListener :: bind ( addr) . map_err ( crate :: Error :: new_listen) ?;
83
87
@@ -94,13 +98,21 @@ impl AddrIncoming {
94
98
}
95
99
96
100
/// Creates a new `AddrIncoming` binding to provided socket address.
101
+ #[ cfg( not( target_os = "wasi" ) ) ]
97
102
pub fn bind ( addr : & SocketAddr ) -> crate :: Result < Self > {
98
103
AddrIncoming :: new ( addr)
99
104
}
100
105
101
106
/// Creates a new `AddrIncoming` from an existing `tokio::net::TcpListener`.
107
+ /// For target `wasm32-wasi`, the assumed local address is "0.0.0.0:0", since
108
+ /// WebAssembly-Wasi has no way to know the local address used for listening.
109
+ /// This could be removed, but would require refactoring a lot of code in Hyper,
110
+ /// and other downstream projects.
102
111
pub fn from_listener ( listener : TcpListener ) -> crate :: Result < Self > {
112
+ #[ cfg( not( target_os = "wasi" ) ) ]
103
113
let addr = listener. local_addr ( ) . map_err ( crate :: Error :: new_listen) ?;
114
+ #[ cfg( target_os = "wasi" ) ]
115
+ let addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: UNSPECIFIED ) , 0 ) ;
104
116
Ok ( AddrIncoming {
105
117
listener,
106
118
addr,
@@ -172,17 +184,26 @@ impl AddrIncoming {
172
184
loop {
173
185
match ready ! ( self . listener. poll_accept( cx) ) {
174
186
Ok ( ( socket, remote_addr) ) => {
175
- if let Some ( tcp_keepalive) = & self . tcp_keepalive_config . into_socket2 ( ) {
176
- let sock_ref = socket2:: SockRef :: from ( & socket) ;
177
- if let Err ( e) = sock_ref. set_tcp_keepalive ( tcp_keepalive) {
178
- trace ! ( "error trying to set TCP keepalive: {}" , e) ;
187
+ #[ cfg( not( target_os = "wasi" ) ) ]
188
+ {
189
+ if let Some ( dur) = self . tcp_keepalive_timeout {
190
+ let socket = socket2:: SockRef :: from ( & socket) ;
191
+ let conf = socket2:: TcpKeepalive :: new ( ) . with_time ( dur) ;
192
+ if let Err ( e) = socket. set_tcp_keepalive ( & conf) {
193
+ trace ! ( "error trying to set TCP keepalive: {}" , e) ;
194
+ }
179
195
}
196
+ if let Err ( e) = socket. set_nodelay ( self . tcp_nodelay ) {
197
+ trace ! ( "error trying to set TCP nodelay: {}" , e) ;
198
+ }
199
+ let local_addr = socket. local_addr ( ) ?;
200
+ return Poll :: Ready ( Ok ( AddrStream :: new ( socket, remote_addr, local_addr) ) ) ;
180
201
}
181
- if let Err ( e) = socket. set_nodelay ( self . tcp_nodelay ) {
182
- trace ! ( "error trying to set TCP nodelay: {}" , e) ;
202
+ #[ cfg( target_os = "wasi" ) ]
203
+ {
204
+ let local_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: UNSPECIFIED ) , 0 ) ;
205
+ return Poll :: Ready ( Ok ( AddrStream :: new ( socket, remote_addr, local_addr) ) ) ;
183
206
}
184
- let local_addr = socket. local_addr ( ) ?;
185
- return Poll :: Ready ( Ok ( AddrStream :: new ( socket, remote_addr, local_addr) ) ) ;
186
207
}
187
208
Err ( e) => {
188
209
// Connection errors can be ignored directly, continue by
@@ -262,6 +283,8 @@ mod addr_stream {
262
283
use std:: net:: SocketAddr ;
263
284
#[ cfg( unix) ]
264
285
use std:: os:: unix:: io:: { AsRawFd , RawFd } ;
286
+ #[ cfg( target_os = "wasi" ) ]
287
+ use std:: os:: wasi:: io:: { AsRawFd , RawFd } ;
265
288
use tokio:: io:: { AsyncRead , AsyncWrite , ReadBuf } ;
266
289
use tokio:: net:: TcpStream ;
267
290
@@ -372,7 +395,7 @@ mod addr_stream {
372
395
}
373
396
}
374
397
375
- #[ cfg( unix) ]
398
+ #[ cfg( any ( unix, target_os = "wasi" ) ) ]
376
399
impl AsRawFd for AddrStream {
377
400
fn as_raw_fd ( & self ) -> RawFd {
378
401
self . inner . as_raw_fd ( )
0 commit comments