#wasi #http #wasmtime #webassembly #experimental


Experimental HTTP library for WebAssembly

1 unstable release

0.10.0 Jan 10, 2023

#363 in WebAssembly

40 downloads per month
Used in lapce-plugin

MIT license

498 lines



Experimental HTTP library for WebAssembly

Using the crate

First, add this crate to your project. Then, it can be used to create and send an HTTP request to a server:

use bytes::Bytes;
use http;
use wasi_experimental_http;

pub extern "C" fn _start() {
    let url = "https://postman-echo.com/post".to_string();
    let req = http::request::Builder::new()
        .header("Content-Type", "text/plain")
        .header("abc", "def");
    let b = Bytes::from("Testing with a request body. Does this actually work?");
    let req = req.body(Some(b)).unwrap();

    let res = wasi_experimental_http::request(req).expect("cannot make request");
    let str = std::str::from_utf8(&res.body_read_all()).unwrap().to_string();
    println!("{:#?}", res.header_get("Content-Type"));
    println!("{}", str);
    println!("{:#?}", res.status_code);

Build the module using the wasm32-wasi target, then execute in a Wasmtime runtime that has the experimental HTTP functionality enabled (the crate to configure it can be found in this repo):

    "content-length": "374",
    "connection": "keep-alive",
    "set-cookie": "sails.Path=/; HttpOnly",
    "vary": "Accept-Encoding",
    "content-type": "application/json; charset=utf-8",
    "date": "Fri, 26 Feb 2021 18:31:03 GMT",
    "etag": "W/\"176-Ky4OTmr3Xbcl3yNah8w2XIQapGU\"",
{"args":{},"data":"Testing with a request body. Does this actually work?","files":{},"form":{},"headers":{"x-forwarded-proto":"https","x-forwarded-port":"443","host":"postman-echo.com","x-amzn-trace-id":"Root=1-60393e67-02d1c8033bcf4f1e74a4523e","content-length":"53","content-type":"text/plain","abc":"def","accept":"*/*"},"json":null,"url":"https://postman-echo.com/post"}
"200 OK"


~45K SLoC