diff --git a/Cargo.lock b/Cargo.lock index e86fcc5..8a7c74a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,7 +13,7 @@ name = "rust-wasi-hello" version = "0.0.0" dependencies = [ "wasi", - "wit-bindgen-rt 0.24.0", + "wit-bindgen-rt 0.30.0", ] [[package]] @@ -27,18 +27,18 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" -version = "0.24.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0780cf7046630ed70f689a098cd8d56c5c3b22f2a7379bbdb088879963ff96" +checksum = "4b18e27825442721d23ed98591a80f55220cfe0bf883d92b1ead6c9be237bb34" dependencies = [ "bitflags", ] [[package]] name = "wit-bindgen-rt" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18e27825442721d23ed98591a80f55220cfe0bf883d92b1ead6c9be237bb34" +checksum = "b2de7a3b06b9725d129b5cbd1beca968feed919c433305a23da46843185ecdd6" dependencies = [ "bitflags", ] diff --git a/Cargo.toml b/Cargo.toml index f3d2a76..479c501 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,21 +13,6 @@ package = "component:rust-wasi-hello" # `get-environment` or other things not present in the proxy world. proxy = true -[package.metadata.component.dependencies] - -[package.metadata.component.target] - -[package.metadata.component.target.dependencies] -"wasi:http" = { path = "wit/deps/http" } -"wasi:clocks" = { path = "wit/deps/clocks" } -"wasi:io" = { path = "wit/deps/io" } -"wasi:random" = { path = "wit/deps/random" } -"wasi:cli" = { path = "wit/deps/cli" } -"wasi:filesystem" = { path = "wit/deps/filesystem" } -"wasi:sockets" = { path = "wit/deps/sockets" } - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] wasi = "0.13.2" -wit-bindgen-rt = { version = "0.24.0", features = ["bitflags"] } +wit-bindgen-rt = { version = "0.30.0", features = ["bitflags"] } diff --git a/src/lib.rs b/src/lib.rs index a784963..77441a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,18 +6,55 @@ struct Component; wasi::http::proxy::export!(Component); impl wasi::exports::http::incoming_handler::Guest for Component { - fn handle(_request: IncomingRequest, outparam: ResponseOutparam) { - let hdrs = Fields::new(); - let resp = OutgoingResponse::new(hdrs); - let body = resp.body().expect("outgoing response"); + fn handle(req: IncomingRequest, outparam: ResponseOutparam) { + match req.path_with_query().unwrap().as_str() { + "/wait" => http_wait(req, outparam), + // "/echo" => {} // TODO + // "/host" => {} // TODO + "/" | _ => http_home(req, outparam), + } + } +} - ResponseOutparam::set(outparam, Ok(resp)); +fn http_home(_req: IncomingRequest, outparam: ResponseOutparam) { + let headers = Fields::new(); + let res = OutgoingResponse::new(headers); + let body = res.body().expect("outgoing response"); - let out = body.write().expect("outgoing stream"); - out.blocking_write_and_flush(b"Hello, wasi:http/proxy world!\n") - .expect("writing response"); + ResponseOutparam::set(outparam, Ok(res)); - drop(out); - OutgoingBody::finish(body, None).unwrap(); - } + let out = body.write().expect("outgoing stream"); + out.blocking_write_and_flush(b"Hello, wasi:http/proxy world!\n") + .expect("writing response"); + + drop(out); + OutgoingBody::finish(body, None).unwrap(); +} + +fn http_wait(_req: IncomingRequest, outparam: ResponseOutparam) { + // Get the time now + let now = wasi::clocks::monotonic_clock::now(); + + // Sleep for 1 second + let nanos = 1_000_000_000; + let pollable = wasi::clocks::monotonic_clock::subscribe_duration(nanos); + pollable.block(); + + // Compute how long we slept for. + let elapsed = wasi::clocks::monotonic_clock::now() - now; + let elapsed = elapsed / 1_000_000; // change to millis + + let headers = Fields::new(); + let res = OutgoingResponse::new(headers); + let body = res.body().expect("outgoing response"); + + ResponseOutparam::set(outparam, Ok(res)); + + let out = body.write().expect("outgoing stream"); + let msg = format!("slept for {elapsed} millis\n"); + out.blocking_write_and_flush(msg.as_bytes()) + .expect("writing response"); + + drop(out); + OutgoingBody::finish(body, None).unwrap(); }