Skip to content

Wire representation

Pavex uses two types to model the request data as it arrives on the wire: RequestHead and RawIncomingBody.

RequestHead

RequestHead encapsulates the data transmitted at the beginning of an HTTP request: method, HTTP version, request target and headers.
All the data in the RequestHead has been read from the wire by the time Pavex invokes your code.

Injection

RequestHead is a framework primitive, you don't have to register a constructor to inject it.

src/head/routes.rs
use pavex::http::StatusCode;
use pavex::request::RequestHead;

pub fn handler(head: &RequestHead) -> StatusCode {
    println!("The HTTP method is {}", head.method);
    println!("The HTTP version is {:?}", head.version);
    println!("The request target is {}", head.target);
    println!("There are {} headers", head.headers.len());
    StatusCode::OK
}

RequestHead is a dependency for a wide range of extractors.
We recommend injecting a shared reference as input (i.e. &RequestHead) rather than consuming RequestHead by value.

RawIncomingBody

RawIncomingBody gives you access to the raw body of the incoming HTTP request.

It sits at the lowest level of abstraction when it comes to body processing. You're looking at the stream of bytes coming from the network. There are no safeguards nor conveniences.

In most situations, you're better off avoiding RawIncomingBody entirely: prefer working with the higher-level body abstractions provided by Pavex.

Injection

RawIncomingBody is a framework primitive, you don't have to register a constructor to inject it.

src/body/routes.rs
use pavex::http::StatusCode;
use pavex::request::body::RawIncomingBody;

pub fn handler(body: RawIncomingBody) -> StatusCode {
    // Your processing logic goes here
    // [...]
}

Most abstractions built on top of RawIncomingBody consume it by value.
You can't really share an instance of RawIncomingBody: you need exclusive access to pull data from the stream of bytes. Pavex will return a borrow-checking error if you try to consume the same RawIncomingBody from different components.

No Request type

There is no over-arching Request type in Pavex.
The access patterns for the data in the request head (headers, method, path) and the body are different. The request head is primarily accessed through a shared reference (i.e. &RequestHead) while the body is consumed by value (i.e. RawIncomingBody).
By keeping them separate, we reduce the occurrence of annoying borrow-checking errors in your day-to-day Pavex work.

You can always inject both types if you need to look at the entire request at once.