Skip to main content

gzip

gzip

Compresses context.response.body with gzip. It is a response-phase node — place it after upstream (and after any body-mutating node such as response-rewrite), before client. The node performs both the request's Accept-Encoding check and the compression itself, in process.

Configuration

All keys are optional.

KeyTypeDefaultDescription
typesarray of strings, or "*"["text/html"]Response content types to compress. "*" matches any. The response content-type is compared with parameters (;charset=...) stripped. A response without a content-type header is never compressed.
min_lengthinteger ≥ 120Bodies shorter than this many bytes are not compressed.
comp_levelinteger 1-91gzip compression level.
varyboolfalseWhen true, appends Vary: Accept-Encoding to compressed responses.
type: gzip
config:
types: ["text/html", "application/json"]
min_length: 20
comp_level: 6
vary: true

Out-of-range levels, min_length: 0, an empty types array, or a types string other than "*" are rejected at config load.

Behavior

This plugin never fails at execution time — it always exits through the success port. The response passes through unchanged when any of these hold:

  • the request's Accept-Encoding does not allow gzip — the token (or *) must be listed with a non-zero q value; a missing header means no compression;
  • the response already carries a content-encoding (never compress twice, and never compress opaque pre-encoded bytes — even for encodings featherbit does not know);
  • the response content-type is absent or does not match types;
  • the body is shorter than min_length.

Otherwise the body is gzip-compressed at comp_level, content-encoding: gzip is set, the stale content-length is removed (the server layer recomputes it from the compressed body), and Vary: Accept-Encoding is appended when vary is set. A codec failure logs a warning and leaves the response untouched.

Behavior notes: http_version and buffers are not supported (featherbit responses are fully buffered), and min_length is compared against the actual buffered body length rather than the upstream Content-Length header. Unlike the brotli node, the gzip node does not weaken ETag headers.

The plugin does not read or write context.message or context.errors.

Errors

This node never fails at execution time: it always returns through success, so its error port is never taken.