Skip to content

Immediate body streaming

Compare
Choose a tag to compare
@tanner0101 tanner0101 released this 26 Jun 18:25
5adcd2e
This patch was authored and released by @tanner0101.

Refactors HTTP request body decoding to immediately make streaming bodies available via req.body.drain (#2413).

Previously, Vapor's HTTP request decoder would wait for a second body chunk to arrive before initiating body streaming. This was done as a performance optimization for single-chunk bodies since streaming has overhead. However, this behavior made it difficult to implement real time streaming handlers, like a ping/pong handler.

The HTTP request decoder has been updated to initiate body streaming immediately upon receiving the first chunk. To avoid impacting performance on small, non-streaming request bodies, a check for content-length has been added. If the request's body is contained entirely in a single chunk, streaming overhead is avoided.

Below are performance numbers on Ubuntu 20.04 in req/s.

Method Body Strategy Previous New Delta
GET .collect 229979.85 229333.16 0.28%
POST .collect 198949.90 196567.85 1.21%
POST .stream 197916.54 196178.48 0.89%

The numbers show a negligible change in performance.