curl_getinfo 没有返回正确的值,总是返回 0

时间:2021-04-07 19:21:13

标签: c libcurl

我正在尝试在 CURLOPT_WRITEFUNCTION 回调函数中获取内容长度信息和 http 状态代码。我在 curl 句柄上使用 curl_getinfo 来查询这些字段,但 curl_getinfo 似乎总是返回默认值。

这是代码


    #include <stdio.h>
    #include <curl/curl.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct url_data {
        size_t size;
        char* data;
        CURL *curl;
    };
    
    size_t _response_header_callback(void *received_data, size_t size, size_t count, void *response_header) {
    
      //printf("%s ", (char *)received_data);
    
    }
    
    size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {
        size_t index = data->size;
        size_t n = (size * nmemb);
        char* tmp;
    
        long responseCode = 0;
        curl_easy_setopt(data->curl, CURLINFO_RESPONSE_CODE, &responseCode);
        curl_off_t cl;
        curl_easy_getinfo(data->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &cl);
        printf("\n whats the response Code %d %d", responseCode, cl);
    
    
        data->size += (size * nmemb);
    
    #ifdef DEBUG
        fprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
    #endif
        tmp = realloc(data->data, data->size + 1); /* +1 for '\0' */
    
        if(tmp) {
            data->data = tmp;
        } else {
            if(data->data) {
                free(data->data);
            }
            fprintf(stderr, "Failed to allocate memory.\n");
            return 0;
        }
    
        memcpy((data->data + index), ptr, n);
        data->data[data->size] = '\0';
    
        return size * nmemb;
    }
    
    char *handle_url(char* url) {
        CURL *curl;
    
        struct url_data data;
        data.size = 0;
        data.data = malloc(4096); /* reasonable size initial buffer */
        if(NULL == data.data) {
            fprintf(stderr, "Failed to allocate memory.\n");
            return NULL;
        }
    
        data.data[0] = '\0';
    
        CURLcode res;
    
        curl = curl_easy_init();
        if (curl) {
            
            data.curl = curl;
            curl_easy_setopt(curl, CURLOPT_URL, url);
    
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
            curl_easy_setopt(curl, CURLOPT_RANGE, "0-50");
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
           
            res = curl_easy_perform(curl);
            if(res != CURLE_OK) {
                    fprintf(stderr, "curl_easy_perform() failed: %s\n",
                            curl_easy_strerror(res));
            }
    
            curl_easy_setopt(curl, CURLOPT_RANGE, "51-100");
            res = curl_easy_perform(curl);
            if(res != CURLE_OK) {
                    fprintf(stderr, "curl_easy_perform() failed: %s\n",
                            curl_easy_strerror(res));
            }
    
            // need to detect that this range isn't satisfiable 
            curl_easy_setopt(curl, CURLOPT_RANGE, "1551-1600");
            curl_easy_perform(curl);
    
            curl_easy_cleanup(curl);
    
        }
        return data.data;
    }
    
    int main(int argc, char* argv[]) {
        char* data;
    
        if(argc < 2) {
            fprintf(stderr, "Must provide URL to fetch.\n");
            return 1;
        }
        data = handle_url(argv[1]);
    
        if(data) {
            printf("%s\n", data);
            free(data);
        }
    
        return 0;
    }

这是输出

    ./fetch http://<url>/test/test_key
    curl_easy_perform() failed: Couldn't resolve host name

 the response Code 0 content length 0
 the response Code 0 content length 0
 the response Code 0 content length 0

<<下载文本>

我使用的是 centos 7 和 libcurl 版本 7.29.0

感谢有人能让我知道我可能做错了什么。谢谢。

0 个答案:

没有答案
相关问题