Content Encoding

About content encodings

HTTP/1.1 specifies that a client may request that a server encode its response. This is usually used to compress a response using one (or more) encodings from a set of commonly available compression techniques. These schemes include deflate (the zlib algorithm), gzip, br (brotli) and compress. A client requests that the server perform an encoding by including an Accept-Encoding header in the request document. The value of the header should be one of the recognized tokens deflate, ... (there is a way to register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor the client's encoding request. When a response is encoded, the server includes a Content-Encoding header in the response. The value of the Content-Encoding header indicates which encodings were used to encode the data, in the order in which they were applied.

It is also possible for a client to attach priorities to different schemes so that the server knows which it prefers. See sec 14.3 of RFC 2616 for more information on the Accept-Encoding header. See sec 3.1.2.2 of RFC 7231 for more information on the Content-Encoding header.

Supported content encodings

The deflate, gzip, zstd and br content encodings are supported by libcurl. Both regular and chunked transfers work fine. The zlib library is required for the deflate and gzip encodings, the brotli decoding library is for the br encoding and not too surprisingly libzstd does zstd.

The libcurl interface

To ask libcurl make a request using content encoding, use:

 curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, string);

where string is the intended value of the Accept-Encoding header.

libcurl supports multiple encodings but only understands how to process responses that use the deflate, gzip, zstd and/or br content encodings, so the only values for CURLOPT_ACCEPT_ENCODING that work (besides identity, which does nothing) are deflate, gzip, zstd and br. If a response is encoded using the compress or methods, libcurl returns an error indicating that the response could not be decoded. If <string> is NULL no Accept-Encoding header is generated. If <string> is a zero-length string, then an Accept-Encoding header containing all supported encodings is generated.

The CURLOPT_ACCEPT_ENCODING must be set to any non-NULL value for content to be automatically decoded. If it is not set and the server still sends encoded content (despite not having been asked), the data is returned in its raw form and the Content-Encoding type is not checked.

The curl interface

Use the --compressed option with curl to cause it to ask servers to compress responses using any format supported by curl.