1
1
use std:: net:: SocketAddr ;
2
- use std:: os:: fd:: OwnedFd ;
3
- use std:: sync:: { Arc , Weak } ;
2
+ use std:: sync:: Arc ;
4
3
use std:: time:: Duration ;
5
4
6
5
pub use crate :: executor:: ExecutorFactory ;
@@ -24,7 +23,6 @@ use runtime::{
24
23
WasmEngine , WasmEngineBuilder ,
25
24
} ;
26
25
use secret:: SecretStrategy ;
27
- use shellflip:: { ShutdownHandle , ShutdownSignal } ;
28
26
use smol_str:: SmolStr ;
29
27
use state:: HttpState ;
30
28
use tokio:: { net:: TcpListener , time:: error:: Elapsed } ;
@@ -35,6 +33,11 @@ pub mod state;
35
33
36
34
pub ( crate ) static TRACEPARENT : & str = "traceparent" ;
37
35
36
+ #[ cfg( target_family = "unix" ) ]
37
+ type OwnedFd = std:: os:: fd:: OwnedFd ;
38
+ #[ cfg( not( target_family = "unix" ) ) ]
39
+ type OwnedFd = std:: os:: raw:: c_int ;
40
+
38
41
#[ cfg( feature = "metrics" ) ]
39
42
const HTTP_LABEL : & [ & str ; 1 ] = & [ "http" ] ;
40
43
@@ -47,7 +50,8 @@ const FASTEDGE_EXECUTION_PANIC: u16 = 533;
47
50
pub struct HttpConfig {
48
51
pub all_interfaces : bool ,
49
52
pub port : u16 ,
50
- pub cancel : Weak < ShutdownHandle > ,
53
+ #[ cfg( target_family = "unix" ) ]
54
+ pub cancel : std:: sync:: Weak < shellflip:: ShutdownHandle > ,
51
55
pub listen_fd : Option < OwnedFd > ,
52
56
pub backoff : u64 ,
53
57
}
87
91
/// Run hyper http service
88
92
async fn run ( self , config : Self :: Config ) -> Result < ( ) > {
89
93
let listener = if let Some ( fd) = config. listen_fd {
90
- let listener = std:: net:: TcpListener :: from ( fd) ;
91
- listener. set_nonblocking ( true ) ?;
92
- TcpListener :: from_std ( listener) ?
94
+ #[ cfg( target_family = "unix" ) ]
95
+ {
96
+ let listener = std:: net:: TcpListener :: from ( fd) ;
97
+ listener. set_nonblocking ( true ) ?;
98
+ TcpListener :: from_std ( listener) ?
99
+ }
100
+
101
+ #[ cfg( not( target_family = "unix" ) ) ]
102
+ panic ! ( "listen_fd is not supported on this platform" )
93
103
} else {
94
104
let interface: [ u8 ; 4 ] = if config. all_interfaces {
95
105
[ 0 , 0 , 0 , 0 ]
@@ -99,17 +109,22 @@ where
99
109
let listen_addr = SocketAddr :: from ( ( interface, config. port ) ) ;
100
110
TcpListener :: bind ( listen_addr) . await ?
101
111
} ;
112
+
102
113
let listen_addr = listener. local_addr ( ) ?;
103
114
tracing:: info!( "Listening on http://{}" , listen_addr) ;
104
115
let mut backoff = 1 ;
105
116
let self_ = Arc :: new ( self ) ;
106
117
let graceful = hyper_util:: server:: graceful:: GracefulShutdown :: new ( ) ;
118
+ #[ cfg( target_family = "unix" ) ]
107
119
let mut signal = config
108
120
. cancel
109
121
. upgrade ( )
110
- . map ( |s| ShutdownSignal :: from ( s. as_ref ( ) ) )
122
+ . map ( |s| shellflip :: ShutdownSignal :: from ( s. as_ref ( ) ) )
111
123
. unwrap_or_default ( ) ;
112
124
125
+ #[ cfg( not( target_family = "unix" ) ) ]
126
+ let signal = signal:: Signal { } ;
127
+
113
128
loop {
114
129
tokio:: select! {
115
130
conn = listener. accept( ) => {
@@ -131,7 +146,7 @@ where
131
146
}
132
147
} ) ;
133
148
134
- let connection = http1:: Builder :: new( ) . keep_alive( true ) . serve_connection( io, service) ;
149
+ let connection = http1:: Builder :: new( ) . keep_alive( true ) . serve_connection( io, service) ;
135
150
let connection = graceful. watch( connection) ;
136
151
tokio:: spawn( async move {
137
152
if let Err ( error) = connection. await {
@@ -586,6 +601,17 @@ fn app_req_headers(geo: impl Iterator<Item = (SmolStr, SmolStr)>) -> HeaderMap {
586
601
headers
587
602
}
588
603
604
+ #[ cfg( not( target_family = "unix" ) ) ]
605
+ pub ( crate ) mod signal {
606
+ pub ( crate ) struct Signal ;
607
+
608
+ impl Signal {
609
+ pub ( crate ) async fn on_shutdown ( & self ) {
610
+ tokio:: signal:: ctrl_c ( ) . await . expect ( "ctrl-c" ) ;
611
+ }
612
+ }
613
+ }
614
+
589
615
#[ cfg( test) ]
590
616
mod tests {
591
617
use test_case:: test_case;
0 commit comments