Skip to content

Commit c578fdd

Browse files
committed
Refactor http-trigger to be more reusable outside of main flow
Signed-off-by: Ryan Levick <[email protected]>
1 parent 152409c commit c578fdd

File tree

3 files changed

+180
-120
lines changed

3 files changed

+180
-120
lines changed

crates/trigger-http2/src/lib.rs

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use serde::Deserialize;
2323
use spin_app::App;
2424
use spin_http::{config::HttpTriggerConfig, routes::Router};
2525
use spin_trigger2::Trigger;
26-
use tokio::net::TcpListener;
2726
use wasmtime_wasi_http::bindings::wasi::http::types::ErrorCode;
2827

2928
use server::HttpServer;
@@ -67,7 +66,7 @@ pub(crate) type InstanceState = ();
6766

6867
/// The Spin HTTP trigger.
6968
pub 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)]

crates/trigger-http2/src/outbound_http.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ use spin_http::routes::RouteMatch;
1111
use spin_outbound_networking::parse_service_chaining_target;
1212
use wasmtime_wasi_http::types::IncomingResponse;
1313

14-
use crate::server::HttpServer;
14+
use crate::server::RequestHandler;
1515

16+
/// An outbound HTTP interceptor that handles service chaining requests.
1617
pub struct OutboundHttpInterceptor {
17-
server: Arc<HttpServer>,
18+
handler: Arc<RequestHandler>,
1819
origin: SelfRequestOrigin,
1920
}
2021

2122
impl OutboundHttpInterceptor {
22-
pub fn new(server: Arc<HttpServer>, origin: SelfRequestOrigin) -> Self {
23-
Self { server, origin }
23+
pub fn new(handler: Arc<RequestHandler>, origin: SelfRequestOrigin) -> Self {
24+
Self { handler, origin }
2425
}
2526
}
2627

@@ -40,10 +41,10 @@ impl spin_factor_outbound_http::OutboundHttpInterceptor for OutboundHttpIntercep
4041
let route_match = RouteMatch::synthetic(&component_id, uri.path());
4142
let req = std::mem::take(request);
4243
let between_bytes_timeout = config.between_bytes_timeout;
43-
let server = self.server.clone();
44+
let server = self.handler.clone();
4445
let resp_fut = async move {
4546
match server
46-
.handle_trigger_route(req, route_match, Scheme::HTTP, CHAINED_CLIENT_ADDR)
47+
.handle_trigger_route(req, &route_match, Scheme::HTTP, CHAINED_CLIENT_ADDR)
4748
.await
4849
{
4950
Ok(resp) => Ok(Ok(IncomingResponse {

0 commit comments

Comments
 (0)