diff --git a/Cargo.lock b/Cargo.lock index a0769bc94a6..9d72dca3dce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,12 +103,6 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - [[package]] name = "assert_cmd" version = "1.0.8" @@ -398,12 +392,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "chunked_transfer" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca491388666e04d7248af3f60f0c40cfb0991c72205595d7c396e3510207d1a" - [[package]] name = "cipher" version = "0.4.3" @@ -548,7 +536,7 @@ version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" dependencies = [ - "ascii 0.9.3", + "ascii", "byteorder", "either", "memchr", @@ -4078,18 +4066,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tiny_http" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" -dependencies = [ - "ascii 1.1.0", - "chunked_transfer", - "httpdate", - "log", -] - [[package]] name = "tinytemplate" version = "1.2.1" @@ -5676,9 +5652,9 @@ dependencies = [ [[package]] name = "wcgi" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "569971bb4ff2a37d0c417821f9cc5e3291aa7fa28e033a405c9da16e86b6fe52" +checksum = "3c55e796fc6fedd026ae32f2ddc3e09df539c456e0089e9b2d59d9eb0acd9d09" dependencies = [ "http", "http-serde", @@ -5711,12 +5687,10 @@ dependencies = [ "futures", "http", "hyper", - "md5", - "reqwest", "serde", "serde_cbor", + "tempfile", "thiserror", - "tiny_http", "tokio", "tower-service", "tracing", diff --git a/lib/wcgi-runner/Cargo.toml b/lib/wcgi-runner/Cargo.toml index 2fa3ed00bfb..ba2042cf861 100644 --- a/lib/wcgi-runner/Cargo.toml +++ b/lib/wcgi-runner/Cargo.toml @@ -11,37 +11,30 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = { version = "1", features = ["backtrace"] } async-trait = "0.1.64" bytes = "1.4.0" -clap = { version = "4", features = ["derive", "env"] } futures = "0.3.25" http = "0.2.8" -hyper = { version = "0.14.23", features = ["server", "stream"] } -md5 = "0.7.0" -serde = { version = "1.0.152", features = ["derive"] } -serde_cbor = "0.11.2" -thiserror = "1.0.38" -tiny_http = "0.12.0" +hyper = { version = "0.14", features = ["server", "stream"] } +serde = { version = "1.0", features = ["derive"] } +serde_cbor = "0.11" +thiserror = "1.0" tokio = { version = "1", features = ["rt-multi-thread", "macros"] } tower-service = "0.3" tracing = "0.1.37" -tracing-subscriber = { version = "0.3.16", features = ["fmt", "env-filter"] } -wasmer = { version = "3.2.0-alpha.1", path = "../api", default-features = false, features = [ - "sys", - "cranelift", - "singlepass", -] } -wasmer-wasi = { version = "3.2.0-alpha.1", path = "../wasi", features = [ - "sys-default", -], default-features = false } +wasmer = { version = "3.2.0-alpha.1", path = "../api", default-features = false } wasmer-vfs = { version = "3.2.0-alpha.1", path = "../vfs", default-features = false } +wasmer-wasi = { version = "3.2.0-alpha.1", path = "../wasi", default-features = false, features = ["sys-default"] } wcgi = { version = "0.1.1" } wcgi-host = { version = "0.1.0" } webc = { version = "5.0.0-rc.1", default-features = false } [dev-dependencies] -reqwest = { version = "0.11.0", default-features = false, features = [ - "rustls-tls", -] } +anyhow = { version = "1", features = ["backtrace"] } +clap = { version = "4", features = ["derive", "env"] } +tempfile = "3.3.0" +tracing-subscriber = { version = "0.3.16", features = ["fmt", "env-filter"] } ureq = "2.6.2" + +[features] +default = ["wasmer/sys", "wasmer/singlepass"] diff --git a/lib/wcgi-runner/src/bin/wcgi-runner.rs b/lib/wcgi-runner/examples/wcgi-runner.rs similarity index 100% rename from lib/wcgi-runner/src/bin/wcgi-runner.rs rename to lib/wcgi-runner/examples/wcgi-runner.rs diff --git a/lib/wcgi-runner/src/builder.rs b/lib/wcgi-runner/src/builder.rs index 974ce8b36ab..3086709cd2f 100644 --- a/lib/wcgi-runner/src/builder.rs +++ b/lib/wcgi-runner/src/builder.rs @@ -25,7 +25,7 @@ use crate::{ /// ```rust,no_run /// use wcgi_runner::Runner; /// # #[tokio::main] -/// # async fn main() -> Result<(), Box> { +/// # async fn main() -> Result<(), Box> { /// let webc = std::fs::read("path/to/server.webc")?; /// let runner = Runner::builder().build_webc(webc)?; /// # Ok(()) diff --git a/lib/wcgi-runner/src/lib.rs b/lib/wcgi-runner/src/lib.rs index c72e74d54a0..32279661917 100644 --- a/lib/wcgi-runner/src/lib.rs +++ b/lib/wcgi-runner/src/lib.rs @@ -1,3 +1,5 @@ +// Rust 1.64 doesn't understand tool-specific lints +#![warn(unknown_lints)] // For now, let's ignore the fact that some of our Error variants are really big #![allow(clippy::result_large_err)] diff --git a/lib/wcgi-runner/src/module_loader/wasm.rs b/lib/wcgi-runner/src/module_loader/wasm.rs index 595bc86b8de..a7542a99b78 100644 --- a/lib/wcgi-runner/src/module_loader/wasm.rs +++ b/lib/wcgi-runner/src/module_loader/wasm.rs @@ -7,7 +7,7 @@ use crate::{ Error, }; -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub struct WasmLoader { program: String, wasm: Bytes, diff --git a/lib/wcgi-runner/src/runner.rs b/lib/wcgi-runner/src/runner.rs index d28fd8f706c..bc16de9064a 100644 --- a/lib/wcgi-runner/src/runner.rs +++ b/lib/wcgi-runner/src/runner.rs @@ -15,10 +15,12 @@ use crate::{context::Context, Builder, Error}; /// so it can be easily integrated with a Hyper server and the Tower ecosystem. /// /// ```rust,no_run -/// # use std::net::SocketAddr; +/// use std::net::SocketAddr; +/// use wcgi_runner::Runner; +/// /// # #[tokio::main] /// # async fn main() -> Result<(), Box> { -/// let webc = b"..."; +/// let webc: &[u8] = b"..."; /// let address: SocketAddr = ([127, 0, 0, 1], 3000).into(); /// let runner = Runner::builder().build_webc(webc)?; /// diff --git a/lib/wcgi-runner/tests/integration.rs b/lib/wcgi-runner/tests/integration.rs index 43761375dc0..8164ed2e809 100644 --- a/lib/wcgi-runner/tests/integration.rs +++ b/lib/wcgi-runner/tests/integration.rs @@ -1,15 +1,15 @@ -use std::{ - path::{Path, PathBuf}, - process::{Command, Output, Stdio}, -}; +use std::path::Path; use bytes::Bytes; use http::{Request, StatusCode}; use hyper::{body::HttpBody, Body}; +use tempfile::TempDir; use wcgi_host::CgiDialect; use wcgi_runner::Builder; const FERRIS_SAYS: &str = "https://registry-cdn.wapm.dev/packages/wasmer-examples/ferris-says/ferris-says-0.2.0-2f5dfb76-77a9-11ed-a646-d2c429a5b858.webc"; +const STATICSERVER: &str = + "https://registry-cdn.wapm.dev/contents/syrusakbary/staticserver/1.0.2/serve.wasm"; #[tokio::test] async fn execute_a_webc_server() { @@ -35,22 +35,19 @@ async fn execute_a_webc_server() { #[tokio::test] async fn execute_a_webassembly_server_with_mounted_directories() { - let static_server = build_wasi("staticserver").join("serve.wasm"); - let wasm = std::fs::read(&static_server).unwrap(); + let wasm = cached(STATICSERVER); + let temp = TempDir::new().unwrap(); + let example = temp.path().join("example"); + std::fs::create_dir_all(&example).unwrap(); + std::fs::write(example.join("file.txt"), b"Hello, World!").unwrap(); let runner = Builder::default() - .program(static_server.display().to_string()) - .map_dir( - "example", - project_root() - .join("examples") - .join("staticserver") - .join("example"), - ) + .program("staticserver") + .map_dir("example", example) .build_wasm(wasm) .unwrap(); let req = Request::builder() - .uri("/example/index.html") + .uri("/example/file.txt") .body(Body::default()) .unwrap(); let response = runner.handle(req).await.unwrap(); @@ -63,7 +60,7 @@ async fn execute_a_webassembly_server_with_mounted_directories() { buffer.extend(chunk); } let body = String::from_utf8(buffer).unwrap(); - assert!(body.contains("

Welcome to WebC

")); + assert!(body.contains("Hello, World!")); } /// Download a file, caching it in $CARGO_TARGET_TMPDIR to avoid unnecessary @@ -96,58 +93,3 @@ fn cached(url: &str) -> Bytes { body.into() } - -/// Compile a package in this workspace to `wasm32-wasi` and get the directory -/// the final binary was saved to. -fn build_wasi(name: &str) -> PathBuf { - let cargo = std::env::var("CARGO").unwrap_or_else(|_| "cargo".to_string()); - - let mut cmd = Command::new(cargo); - cmd.arg("build") - .arg("--target=wasm32-wasi") - .args(["--package", name]) - .stdin(Stdio::null()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()); - - // Note: We were seeing build failures in CI because "cargo llvm-cov" - // automatically sets $RUSTFLAGS to include "-Zinstrument-coverage" and - // "profielr_builtins" isn't available for WebAssembly. - // See https://github.com/taiki-e/cargo-llvm-cov/issues/221 - cmd.env("RUSTFLAGS", ""); - - let Output { - status, - stdout, - stderr, - } = cmd.output().expect("Unable to invoke cargo"); - - if !status.success() { - if !stdout.is_empty() { - eprintln!("---- STDOUT ----"); - eprintln!("{}", String::from_utf8_lossy(&stdout)); - } - if !stderr.is_empty() { - eprintln!("---- STDERR ----"); - eprintln!("{}", String::from_utf8_lossy(&stderr)); - } - panic!("{cmd:?} failed with {status}"); - } - - let target_dir = match std::env::var("CARGO_TARGET_DIR") { - Ok(s) => PathBuf::from(s), - Err(_) => project_root().join("target"), - }; - target_dir.join("wasm32-wasi").join("debug") -} - -fn project_root() -> &'static Path { - let path = Path::new(env!("CARGO_MANIFEST_DIR")) - .ancestors() - .nth(2) - .unwrap(); - - assert!(path.join(".git").exists()); - - path -}