Skip to content

Commit 7fec31c

Browse files
committed
reduce trigger-http p2 and p3 code duplication
Signed-off-by: Joel Dice <[email protected]>
1 parent 4486786 commit 7fec31c

File tree

2 files changed

+39
-48
lines changed

2 files changed

+39
-48
lines changed

crates/trigger-http/src/wasi.rs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::io::IsTerminal;
22
use std::net::SocketAddr;
33

4-
use anyhow::{anyhow, Context, Result};
4+
use anyhow::{Context, Result, anyhow};
55
use futures::TryFutureExt;
66
use http::{HeaderName, HeaderValue};
77
use hyper::{Request, Response};
@@ -11,11 +11,39 @@ use spin_factors::RuntimeFactors;
1111
use spin_http::routes::RouteMatch;
1212
use spin_http::trigger::HandlerType;
1313
use tokio::{sync::oneshot, task};
14-
use tracing::{instrument, Instrument, Level};
14+
use tracing::{Instrument, Level, instrument};
1515
use wasmtime_wasi_http::bindings::http::types::Scheme;
16-
use wasmtime_wasi_http::{bindings::Proxy, body::HyperIncomingBody as Body, WasiHttpView};
17-
18-
use crate::{headers::prepare_request_headers, server::HttpExecutor, TriggerInstanceBuilder};
16+
use wasmtime_wasi_http::{WasiHttpView, bindings::Proxy, body::HyperIncomingBody as Body};
17+
18+
use crate::{TriggerInstanceBuilder, headers::prepare_request_headers, server::HttpExecutor};
19+
20+
pub(super) fn prepare_request(
21+
route_match: &RouteMatch<'_, '_>,
22+
req: &mut Request<Body>,
23+
client_addr: SocketAddr,
24+
) -> Result<()> {
25+
let spin_http::routes::TriggerLookupKey::Component(component_id) = route_match.lookup_key()
26+
else {
27+
unreachable!()
28+
};
29+
30+
tracing::trace!("Executing request using the Wasi executor for component {component_id}");
31+
32+
let headers = prepare_request_headers(req, route_match, client_addr)?;
33+
req.headers_mut().clear();
34+
req.headers_mut()
35+
.extend(headers.into_iter().filter_map(|(n, v)| {
36+
let Ok(name) = n.parse::<HeaderName>() else {
37+
return None;
38+
};
39+
let Ok(value) = HeaderValue::from_bytes(v.as_bytes()) else {
40+
return None;
41+
};
42+
Some((name, value))
43+
}));
44+
45+
Ok(())
46+
}
1947

2048
/// An [`HttpExecutor`] that uses the `wasi:http/incoming-handler` interface.
2149
pub struct WasiHttpExecutor<'a> {
@@ -31,28 +59,10 @@ impl HttpExecutor for WasiHttpExecutor<'_> {
3159
mut req: Request<Body>,
3260
client_addr: SocketAddr,
3361
) -> Result<Response<Body>> {
34-
let spin_http::routes::TriggerLookupKey::Component(component_id) = route_match.lookup_key()
35-
else {
36-
anyhow::bail!("INCONCEIVABLE");
37-
};
38-
39-
tracing::trace!("Executing request using the Wasi executor for component {component_id}");
62+
prepare_request(route_match, &mut req, client_addr)?;
4063

4164
let (instance, mut store) = instance_builder.instantiate(()).await?;
4265

43-
let headers = prepare_request_headers(&req, route_match, client_addr)?;
44-
req.headers_mut().clear();
45-
req.headers_mut()
46-
.extend(headers.into_iter().filter_map(|(n, v)| {
47-
let Ok(name) = n.parse::<HeaderName>() else {
48-
return None;
49-
};
50-
let Ok(value) = HeaderValue::from_bytes(v.as_bytes()) else {
51-
return None;
52-
};
53-
Some((name, value))
54-
}));
55-
5666
let mut wasi_http = spin_factor_outbound_http::OutboundHttpFactor::get_wasi_http_impl(
5767
store.data_mut().factors_instance_state_mut(),
5868
)

crates/trigger-http/src/wasip3.rs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
use crate::{headers, server::HttpExecutor, TriggerInstanceBuilder};
1+
use crate::{TriggerInstanceBuilder, server::HttpExecutor};
22
use anyhow::{Context, Result};
3-
use futures::{channel::oneshot, FutureExt};
4-
use http::{HeaderName, HeaderValue};
3+
use futures::{FutureExt, channel::oneshot};
54
use http_body_util::BodyExt;
65
use spin_factors::RuntimeFactors;
76
use spin_factors_executor::InstanceState;
87
use spin_http::routes::RouteMatch;
98
use std::net::SocketAddr;
109
use tokio::task;
11-
use tracing::{instrument, Level};
10+
use tracing::{Level, instrument};
1211
use wasmtime_wasi_http::{
1312
body::HyperIncomingBody as Body,
1413
p3::{
15-
bindings::{http::types, ProxyIndices},
1614
WasiHttpCtxView,
15+
bindings::{ProxyIndices, http::types},
1716
},
1817
};
1918

@@ -29,28 +28,10 @@ impl HttpExecutor for Wasip3HttpExecutor<'_> {
2928
mut req: http::Request<Body>,
3029
client_addr: SocketAddr,
3130
) -> Result<http::Response<Body>> {
32-
let spin_http::routes::TriggerLookupKey::Component(component_id) = route_match.lookup_key()
33-
else {
34-
anyhow::bail!("INCONCEIVABLE");
35-
};
36-
37-
tracing::trace!("Executing request using the Wasi executor for component {component_id}");
31+
super::wasi::prepare_request(route_match, &mut req, client_addr)?;
3832

3933
let (instance, mut store) = instance_builder.instantiate(()).await?;
4034

41-
let headers = headers::prepare_request_headers(&req, route_match, client_addr)?;
42-
req.headers_mut().clear();
43-
req.headers_mut()
44-
.extend(headers.into_iter().filter_map(|(n, v)| {
45-
let Ok(name) = n.parse::<HeaderName>() else {
46-
return None;
47-
};
48-
let Ok(value) = HeaderValue::from_bytes(v.as_bytes()) else {
49-
return None;
50-
};
51-
Some((name, value))
52-
}));
53-
5435
let getter = (|data| wasi_http::<F>(data).unwrap())
5536
as fn(&mut InstanceState<F::InstanceState, ()>) -> WasiHttpCtxView<'_>;
5637

0 commit comments

Comments
 (0)