@@ -23,7 +23,6 @@ use serde::Deserialize;
2323use spin_app:: App ;
2424use spin_http:: { config:: HttpTriggerConfig , routes:: Router } ;
2525use spin_trigger2:: Trigger ;
26- use tokio:: net:: TcpListener ;
2726use wasmtime_wasi_http:: bindings:: wasi:: http:: types:: ErrorCode ;
2827
2928use server:: HttpServer ;
@@ -67,7 +66,7 @@ pub(crate) type InstanceState = ();
6766
6867/// The Spin HTTP trigger.
6968pub struct HttpTrigger {
70- /// The address the server will listen on.
69+ /// The address the server should listen on.
7170 ///
7271 /// Note that this might not be the actual socket address that ends up being bound to.
7372 /// If the port is set to 0, the actual address will be determined by the OS.
@@ -85,6 +84,29 @@ impl Trigger for HttpTrigger {
8584 type InstanceState = InstanceState ;
8685
8786 fn new ( cli_args : Self :: CliArgs , app : & spin_app:: App ) -> anyhow:: Result < Self > {
87+ Self :: new ( app, cli_args. address , cli_args. into_tls_config ( ) )
88+ }
89+
90+ async fn run ( self , trigger_app : TriggerApp ) -> anyhow:: Result < ( ) > {
91+ let server = self . into_server ( trigger_app) ?;
92+
93+ server. serve ( ) . await ?;
94+
95+ Ok ( ( ) )
96+ }
97+
98+ fn supported_host_requirements ( ) -> Vec < & ' static str > {
99+ vec ! [ spin_app:: locked:: SERVICE_CHAINING_KEY ]
100+ }
101+ }
102+
103+ impl HttpTrigger {
104+ /// Create a new `HttpTrigger`.
105+ pub fn new (
106+ app : & spin_app:: App ,
107+ listen_addr : SocketAddr ,
108+ tls_config : Option < TlsConfig > ,
109+ ) -> anyhow:: Result < Self > {
88110 Self :: validate_app ( app) ?;
89111
90112 let component_trigger_configs = HashMap :: from_iter (
@@ -114,55 +136,32 @@ impl Trigger for HttpTrigger {
114136 "Constructed router: {:?}" ,
115137 router. routes( ) . collect:: <Vec <_>>( )
116138 ) ;
117-
118139 Ok ( Self {
119- listen_addr : cli_args . address ,
120- tls_config : cli_args . into_tls_config ( ) ,
140+ listen_addr,
141+ tls_config,
121142 router,
122143 component_trigger_configs,
123144 } )
124145 }
125146
126- async fn run ( self , trigger_app : TriggerApp ) -> anyhow:: Result < ( ) > {
147+ /// Turn this [`HttpTrigger`] into an [`HttpServer`].
148+ pub fn into_server ( self , trigger_app : TriggerApp ) -> anyhow:: Result < Arc < HttpServer > > {
127149 let Self {
128150 listen_addr,
129151 tls_config,
130152 router,
131153 component_trigger_configs,
132154 } = self ;
133-
134- let listener = TcpListener :: bind ( listen_addr)
135- . await
136- . with_context ( || format ! ( "Unable to listen on {listen_addr}" ) ) ?;
137-
138- // Get the address the server is actually listening on
139- // We can't use `self.listen_addr` because it might not
140- // be fully resolved (e.g, port 0).
141- let listen_addr = listener
142- . local_addr ( )
143- . context ( "failed to retrieve address server is listening on" ) ?;
144155 let server = Arc :: new ( HttpServer :: new (
145156 listen_addr,
157+ tls_config,
146158 trigger_app,
147159 router,
148160 component_trigger_configs,
149161 ) ?) ;
150-
151- if let Some ( tls_config) = tls_config {
152- server. serve_tls ( listener, tls_config) . await ?
153- } else {
154- server. serve ( listener) . await ?
155- } ;
156-
157- Ok ( ( ) )
162+ Ok ( server)
158163 }
159164
160- fn supported_host_requirements ( ) -> Vec < & ' static str > {
161- vec ! [ spin_app:: locked:: SERVICE_CHAINING_KEY ]
162- }
163- }
164-
165- impl HttpTrigger {
166165 fn validate_app ( app : & App ) -> anyhow:: Result < ( ) > {
167166 #[ derive( Deserialize ) ]
168167 #[ serde( deny_unknown_fields) ]
0 commit comments