diff --git a/lib/virtual_adapter.debug.wasm b/lib/virtual_adapter.debug.wasm index b5ea254..7983276 100755 Binary files a/lib/virtual_adapter.debug.wasm and b/lib/virtual_adapter.debug.wasm differ diff --git a/lib/virtual_adapter.wasm b/lib/virtual_adapter.wasm index 6e2d759..ddeea2c 100755 Binary files a/lib/virtual_adapter.wasm and b/lib/virtual_adapter.wasm differ diff --git a/src/virt_deny/http.rs b/src/virt_deny/http.rs index e38d0b6..7ca8bb4 100644 --- a/src/virt_deny/http.rs +++ b/src/virt_deny/http.rs @@ -261,6 +261,11 @@ fn get_wasi_http_fns() -> &'static Vec<(&'static str, FuncParams, FuncResults)> vec![ValType::I32], vec![ValType::I32], ), + ( + "wasi:http/outgoing-handler@0.2.0-rc-2023-10-18#handle", + vec![ValType::I32; 8], + vec![ValType::I32], + ), ]) }) } diff --git a/src/virt_io/http.rs b/src/virt_io/http.rs index b5d23e2..cf63823 100644 --- a/src/virt_io/http.rs +++ b/src/virt_io/http.rs @@ -44,6 +44,7 @@ const WASI_HTTP_EXPORTS: &[&str] = &[ "wasi:http/types@0.2.0-rc-2023-10-18#[dtor]future-incoming-response", "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-incoming-response.get", "wasi:http/types@0.2.0-rc-2023-10-18#[method]future-incoming-response.subscribe", + "wasi:http/outgoing-handler@0.2.0-rc-2023-10-18#handle", ]; /// Strip exported WASI functions that implement HTTP access diff --git a/virtual-adapter/src/io.rs b/virtual-adapter/src/io.rs index 70964c9..101ba14 100644 --- a/virtual-adapter/src/io.rs +++ b/virtual-adapter/src/io.rs @@ -13,12 +13,13 @@ use crate::exports::wasi::filesystem::types::{ DirectoryEntry, DirectoryEntryStream, ErrorCode, Guest as FilesystemTypes, GuestDescriptor, GuestDirectoryEntryStream, MetadataHashValue, Modes, NewTimestamp, OpenFlags, PathFlags, }; +use crate::exports::wasi::http::outgoing_handler::Guest as OutgoingHandler; use crate::exports::wasi::http::types::{ Error as HttpError, Fields, FutureIncomingResponse, FutureTrailers, GuestFields, GuestFutureIncomingResponse, GuestFutureTrailers, GuestIncomingBody, GuestIncomingRequest, GuestIncomingResponse, GuestOutgoingBody, GuestOutgoingRequest, GuestOutgoingResponse, GuestResponseOutparam, IncomingBody, IncomingRequest, IncomingResponse, Method, OutgoingBody, - OutgoingRequest, OutgoingResponse, ResponseOutparam, Scheme, StatusCode, + OutgoingRequest, OutgoingResponse, RequestOptions, ResponseOutparam, Scheme, StatusCode, }; use crate::exports::wasi::io::poll::{Guest as Poll, Pollable}; use crate::exports::wasi::io::streams::{ @@ -43,6 +44,7 @@ use crate::wasi::io::streams; // these are all the subsystems which touch streams + poll use crate::wasi::clocks::monotonic_clock; +use crate::wasi::http::outgoing_handler; use crate::wasi::http::types as http_types; use crate::wasi::io::poll; use crate::wasi::sockets::ip_name_lookup; @@ -597,6 +599,17 @@ impl Preopens for VirtAdapter { } } +impl OutgoingHandler for VirtAdapter { + fn handle( + request: Resource, + options: Option, + ) -> Result, HttpError> { + outgoing_handler::handle(Resource::take(request).0, options.map(request_options_map)) + .map(|response| Resource::new(HttpFutureIncomingResponse(response))) + .map_err(http_err_map_rev) + } +} + impl Poll for VirtAdapter { fn poll_list(list: Vec<&Pollable>) -> Vec { debug!("CALL wasi:io/poll#poll-list PIDS={list:?}",); @@ -1805,6 +1818,14 @@ fn http_err_map_rev(err: http_types::Error) -> HttpError { } } +fn request_options_map(options: RequestOptions) -> http_types::RequestOptions { + http_types::RequestOptions { + connect_timeout_ms: options.connect_timeout_ms, + first_byte_timeout_ms: options.first_byte_timeout_ms, + between_bytes_timeout_ms: options.between_bytes_timeout_ms, + } +} + // This function gets mutated by the virtualizer #[no_mangle] #[inline(never)] diff --git a/virtual-adapter/src/lib.rs b/virtual-adapter/src/lib.rs index 55a2dee..fdc5835 100644 --- a/virtual-adapter/src/lib.rs +++ b/virtual-adapter/src/lib.rs @@ -39,6 +39,7 @@ wit_bindgen::generate!({ "wasi:http/types/outgoing-request": io::HttpOutgoingRequest, "wasi:http/types/outgoing-response": io::HttpOutgoingResponse, "wasi:http/types/response-outparam": io::HttpResponseOutparam, + "wasi:http/outgoing-handler": VirtAdapter, "wasi:sockets/ip-name-lookup": VirtAdapter, "wasi:sockets/ip-name-lookup/resolve-address-stream": io::SocketsResolveAddressStream, "wasi:sockets/tcp/tcp-socket": io::SocketsTcpSocket, diff --git a/wit/virt.wit b/wit/virt.wit index fe3ac6e..62a5ac0 100644 --- a/wit/virt.wit +++ b/wit/virt.wit @@ -33,6 +33,8 @@ world virtual-adapter { export wasi:clocks/monotonic-clock@0.2.0-rc-2023-10-18; import wasi:http/types@0.2.0-rc-2023-10-18; export wasi:http/types@0.2.0-rc-2023-10-18; + import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; + export wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; export wasi:sockets/ip-name-lookup@0.2.0-rc-2023-10-18; import wasi:sockets/tcp@0.2.0-rc-2023-10-18; @@ -71,6 +73,8 @@ world virtual-io-clocks { world virtual-io-http { import wasi:http/types@0.2.0-rc-2023-10-18; export wasi:http/types@0.2.0-rc-2023-10-18; + import wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; + export wasi:http/outgoing-handler@0.2.0-rc-2023-10-18; } world virtual-fs {