I added curl_easy_setopt(client, CURLOPT_ENCODING, "gzip");
to my code.
I expected curl to cause the server to send compressed data AND to decompress it.
Actually i see in HTTP header that the data is compressed (Vary: Accept-Encoding Content-Encoding: gzip), but curl doesn't decompress it for me.
Is there an additional command I should use for this?
Note that this option has been renamed to CURLOPT_ACCEPT_ENCODING
.
As stated by the documentation:
Sets the contents of the Accept-Encoding: header sent in a HTTP request, and enables decoding of a response when a Content-Encoding: header is received.
So it does decode (i.e decompress) the response. Three encoding are supported: "identity"
(does nothing), "zlib"
and "gzip"
. Alternatively you can pass an empty string which creates an Accept-Encoding:
header containing all supported encodings.
At last, httpbin is handy to test it out as it contains a dedicated endpoint that returns gzip content. Here's an example:
#include <curl/curl.h>
int
main(void)
{
CURLcode rc;
CURL *curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/gzip");
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
rc = curl_easy_perform(curl);
curl_easy_cleanup(curl);
return (int) rc;
}
It sends:
GET /gzip HTTP/1.1
Host: httpbin.org
Accept: */*
Accept-Encoding: gzip
And gets as response:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Encoding: gzip
Content-Type: application/json
...
And a JSON response (thus decompressed) is written on stdout.