11use std:: io:: IsTerminal ;
22use std:: net:: SocketAddr ;
33
4- use anyhow:: { anyhow , Context , Result } ;
4+ use anyhow:: { Context , Result , anyhow } ;
55use futures:: TryFutureExt ;
66use http:: { HeaderName , HeaderValue } ;
77use hyper:: { Request , Response } ;
@@ -11,11 +11,39 @@ use spin_factors::RuntimeFactors;
1111use spin_http:: routes:: RouteMatch ;
1212use spin_http:: trigger:: HandlerType ;
1313use tokio:: { sync:: oneshot, task} ;
14- use tracing:: { instrument , Instrument , Level } ;
14+ use tracing:: { Instrument , Level , instrument } ;
1515use 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.
2149pub 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 )
0 commit comments