From eefe86ee6edc5b43c9d025bcf4efcdadc7a00f93 Mon Sep 17 00:00:00 2001 From: Xinzhao Xu Date: Fri, 7 Jun 2024 16:41:30 +0800 Subject: [PATCH] Add examples --- Cargo.toml | 1 + examples/README.md | 3 - examples/client/Cargo.toml | 17 +++ examples/client/README.md | 114 ++++++++++++++++++ examples/client/src/bindings.rs | 18 +++ examples/client/src/main.rs | 101 ++++++++++++++++ .../wasi_snapshot_preview1.command.wasm | Bin 0 -> 81309 bytes examples/server/Cargo.toml | 19 +++ examples/server/README.md | 41 +++++++ examples/server/src/bindings.rs | 18 +++ examples/server/src/lib.rs | 15 +++ .../server/wasi_snapshot_preview1.proxy.wasm | Bin 0 -> 28530 bytes 12 files changed, 344 insertions(+), 3 deletions(-) delete mode 100644 examples/README.md create mode 100644 examples/client/Cargo.toml create mode 100644 examples/client/README.md create mode 100644 examples/client/src/bindings.rs create mode 100644 examples/client/src/main.rs create mode 100644 examples/client/wasi_snapshot_preview1.command.wasm create mode 100644 examples/server/Cargo.toml create mode 100644 examples/server/README.md create mode 100644 examples/server/src/bindings.rs create mode 100644 examples/server/src/lib.rs create mode 100644 examples/server/wasi_snapshot_preview1.proxy.wasm diff --git a/Cargo.toml b/Cargo.toml index 4488fab..80381dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ members = [ "waki-macros", "test-programs", ] +exclude = ["examples"] [workspace.package] version = "0.2.0" diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 450bd78..0000000 --- a/examples/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Examples - -See https://github.com/wacker-dev/wasi-examples/tree/main/http-server for a real-world example. diff --git a/examples/client/Cargo.toml b/examples/client/Cargo.toml new file mode 100644 index 0000000..a3d75a0 --- /dev/null +++ b/examples/client/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "http-client" +version = "0.0.0" +edition = "2021" +publish = false + +[package.metadata.component] +adapter = "wasi_snapshot_preview1.command.wasm" + +[dependencies] +waki = { version = "0.2.0", features = ["json"] } +serde = { version = "1.0.202", features = ["derive"] } + +# reduce wasm binary size +[profile.release] +lto = true +strip = "symbols" diff --git a/examples/client/README.md b/examples/client/README.md new file mode 100644 index 0000000..93e3486 --- /dev/null +++ b/examples/client/README.md @@ -0,0 +1,114 @@ +# http-client + +This example is built using the [WASI Preview 2 API](https://github.com/WebAssembly/wasi-http) +with the [waki](https://github.com/wacker-dev/waki) library. + +## Build + +First, install [cargo component](https://github.com/bytecodealliance/cargo-component): + +``` +cargo install cargo-component@0.11.0 +``` + +Then execute the following command to compile it into a WASM program: + +``` +$ cargo component build +``` + +Or use `--release` option to build it in release mode: + +``` +$ cargo component build --release +``` + +## Run + +After compilation, you can use [wasmtime](https://github.com/bytecodealliance/wasmtime) to run it: + +``` +$ wasmtime -S http target/wasm32-wasi/debug/http-client.wasm + +GET https://httpbin.org/get, status code: 200, body: +{ + "args": { + "a": "b" + }, + "headers": { + "Accept": "*/*", + "Content-Type": "application/json", + "Host": "httpbin.org", + "X-Amzn-Trace-Id": "..." + }, + "origin": "...", + "url": "https://httpbin.org/get?a=b" +} + +GET https://httpbin.org/get, status code: 200, body: +Data { origin: "117.172.222.76", url: "https://httpbin.org/get" } + +GET https://httpbin.org/range, status code: 200, body: +abcdefghij +klmnopqrst + +POST https://httpbin.org/post, status code: 200, body: +{ + "args": {}, + "data": "{\"data\":\"hello\"}", + "files": {}, + "form": {}, + "headers": { + "Content-Length": "16", + "Content-Type": "application/json", + "Host": "httpbin.org", + "X-Amzn-Trace-Id": "..." + }, + "json": { + "data": "hello" + }, + "origin": "...", + "url": "https://httpbin.org/post" +} + +POST https://httpbin.org/post, status code: 200, body: +{ + "args": {}, + "data": "", + "files": {}, + "form": { + "a": "b", + "c": "" + }, + "headers": { + "Content-Length": "6", + "Content-Type": "application/x-www-form-urlencoded", + "Host": "httpbin.org", + "X-Amzn-Trace-Id": "..." + }, + "json": null, + "origin": "...", + "url": "https://httpbin.org/post" +} + +POST https://httpbin.org/post, status code: 200, body: +{ + "args": {}, + "data": "", + "files": { + "field2": "hello" + }, + "form": { + "field1": "value1" + }, + "headers": { + "Content-Length": "181", + "Content-Type": "multipart/form-data; boundary=boundary", + "Host": "httpbin.org", + "X-Amzn-Trace-Id": "..." + }, + "json": null, + "origin": "...", + "url": "https://httpbin.org/post" +} +``` diff --git a/examples/client/src/bindings.rs b/examples/client/src/bindings.rs new file mode 100644 index 0000000..8ff93e5 --- /dev/null +++ b/examples/client/src/bindings.rs @@ -0,0 +1,18 @@ +// Generated by `wit-bindgen` 0.24.0. DO NOT EDIT! +// Options used: + +#[cfg(target_arch = "wasm32")] +#[link_section = "component-type:wit-bindgen:0.24.0:http-client:encoded world"] +#[doc(hidden)] +pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 173] = *b"\ +\0asm\x0d\0\x01\0\0\x19\x16wit-component-encoding\x04\0\x07,\x01A\x02\x01A\0\x04\ +\x01!component:http-client/http-client\x04\0\x0b\x11\x01\0\x0bhttp-client\x03\0\0\ +\0G\x09producers\x01\x0cprocessed-by\x02\x0dwit-component\x070.202.0\x10wit-bind\ +gen-rust\x060.24.0"; + +#[inline(never)] +#[doc(hidden)] +#[cfg(target_arch = "wasm32")] +pub fn __link_custom_section_describing_imports() { + wit_bindgen_rt::maybe_link_cabi_realloc(); +} diff --git a/examples/client/src/main.rs b/examples/client/src/main.rs new file mode 100644 index 0000000..29b1d6d --- /dev/null +++ b/examples/client/src/main.rs @@ -0,0 +1,101 @@ +use serde::Deserialize; +use std::collections::HashMap; +use std::time::Duration; +use waki::Client; + +#[derive(Debug, Deserialize)] +#[allow(dead_code)] +struct Data { + origin: String, + url: String, +} + +fn main() { + // get with query + let resp = Client::new() + .get("https://httpbin.org/get?a=b") + .headers([("Content-Type", "application/json"), ("Accept", "*/*")]) + .send() + .unwrap(); + println!( + "GET https://httpbin.org/get, status code: {}, body:\n{}", + resp.status_code(), + String::from_utf8(resp.body().unwrap()).unwrap() + ); + + // get with json response + let resp = Client::new().get("https://httpbin.org/get").send().unwrap(); + let status = resp.status_code(); + let json_data = resp.json::().unwrap(); + println!( + "GET https://httpbin.org/get, status code: {}, body:\n{:?}\n", + status, json_data, + ); + + // play with the response chunk + let resp = Client::new() + .get("https://httpbin.org/range/20") + .query(&[("duration", "5"), ("chunk_size", "10")]) + .send() + .unwrap(); + println!( + "GET https://httpbin.org/range, status code: {}, body:", + resp.status_code() + ); + while let Some(chunk) = resp.chunk(1024).unwrap() { + println!("{}", String::from_utf8(chunk).unwrap()); + } + println!(); + + // post with json data + let resp = Client::new() + .post("https://httpbin.org/post") + .json(&HashMap::from([("data", "hello")])) + .connect_timeout(Duration::from_secs(5)) + .send() + .unwrap(); + println!( + "POST https://httpbin.org/post, status code: {}, body:\n{}", + resp.status_code(), + String::from_utf8(resp.body().unwrap()).unwrap() + ); + + // post with form data + let resp = Client::new() + .post("https://httpbin.org/post") + .form(&[("a", "b"), ("c", "")]) + .connect_timeout(Duration::from_secs(5)) + .send() + .unwrap(); + println!( + "POST https://httpbin.org/post, status code: {}, body:\n{}", + resp.status_code(), + String::from_utf8(resp.body().unwrap()).unwrap() + ); + + // post with file form data + let resp = Client::new() + .post("https://httpbin.org/post") + .header("Content-Type", "multipart/form-data; boundary=boundary") + .body( + "--boundary +Content-Disposition: form-data; name=field1 + +value1 +--boundary +Content-Disposition: form-data; name=field2; filename=file.txt +Content-Type: text/plain + +hello +--boundary--" + .as_bytes(), + ) + .connect_timeout(Duration::from_secs(5)) + .send() + .unwrap(); + println!( + "POST https://httpbin.org/post, status code: {}, body:\n{}", + resp.status_code(), + String::from_utf8(resp.body().unwrap()).unwrap() + ); +} diff --git a/examples/client/wasi_snapshot_preview1.command.wasm b/examples/client/wasi_snapshot_preview1.command.wasm new file mode 100644 index 0000000000000000000000000000000000000000..6f260d430955e87972bfb7a5f76b88b531a86aa3 GIT binary patch literal 81309 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 Result { + let query = req.query(); + Response::builder() + .body( + format!( + "Hello, {}!", + query.get("name").unwrap_or(&"WASI".to_string()) + ) + .as_bytes(), + ) + .build() +} diff --git a/examples/server/wasi_snapshot_preview1.proxy.wasm b/examples/server/wasi_snapshot_preview1.proxy.wasm new file mode 100644 index 0000000000000000000000000000000000000000..149ec03a1cabd2112a293546f8c52fbf18cfba56 GIT binary patch literal 28530 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