decompression gzip data with curl

前端 未结 2 645
陌清茗
陌清茗 2021-02-05 23:19

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

相关标签:
2条回答
  • 2021-02-05 23:44

    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.

    0 讨论(0)
  • 2021-02-06 00:01

    c++ CURL library does not compress/decompress your data. you must do it yourself.

            CURL *curl = curl_easy_init();
    
            struct curl_slist *headers=NULL;
            headers = curl_slist_append(headers, "Accept: application/json");
            headers = curl_slist_append(headers, "Content-Type: application/json");
            headers = curl_slist_append(headers, "Content-Encoding: gzip");
    
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers );
            curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip");
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, zipped_data.data() );
            curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, zipped_data.size() );
    
    0 讨论(0)
提交回复
热议问题