WASI HTTP

A proposed WebAssembly System Interface API.

Current Phase

wasi-http is currently in Phase 3

Champions

  • Piotr Sikora
  • Jiaxiao Zhou
  • Dan Chiarlone
  • David Justice
  • Luke Wagner

Portability Criteria

WASI-http must have at least two complete independent implementations demonstrating embeddability in a production HTTP server context.

Introduction

The WASI-http proposal defines a collection of interfaces for sending and receiving HTTP requests and responses. WASI-http additionally defines a world, wasi:http/proxy, that circumscribes a minimal execution environment for wasm HTTP proxies.

Goals

The proposal intends to abstract over HTTP version and transport protocol choices (such as HTTP/1.1, HTTP/2 or HTTP/3) by mapping directly to the abstract HTTP Semantics, allowing hosts to (mostly) transparently use any of these.

The wasi:http/proxy world is meant to be implementable by a wide variety of hosts including Web service workers, forward- and reverse-proxies and origin servers by requiring a minimal set of additional runtime support.

The wasi:http/proxy world is meant to support flexible auto-scaling ("serverless") execution by moving the core accept() loop into the host and allowing the host to dynamically spin up wasm instances in response to arriving requests.

The wasi:http/proxy world is meant to allow the chaining of HTTP intermediaries to be implemented directly in terms of Component Model linking. (Fully realizing this goal will require additional features only available in the Preview 3 timeframe.)

Non-goals

WASI-http does not intend to define a more fully-featured cloud execution environment (for this, see the wasi-cloud-core proposal).

API walk-through

The proposal can be understood by first reading the comments of proxy.wit, then handler.wit and finally types.wit.

Working with the WIT

Bindings can be generated from the wit directory via:

wit-bindgen c wit/ --world proxy

and can be validated and otherwise manipulated via:

wasm-tools component wit wit/ ...

The wit/deps directory contains a live snapshot of the contents of several other WASI proposals upon which this proposal depends. It is automatically updated by running wit-deps update in the root directory, which fetches the live contents of the main branch of each proposal. As things stablize, wit/deps.toml will be updated to refer to versioned releases.

References & acknowledgements

  • This proposal was seeded by and developed in consultation with proxy-wasm.