C libcurl小于预期的响应大小

时间:2018-11-23 14:39:09

标签: c curl libcurl

我正在尝试使用libcurl下载网页的内容,但是我得到的响应比预期的要小得多-文档说最大大小为16K,但是我得到的响应却比预期的要小得多那个。

例如,当页面在gedit中为71915字节时,请求en Wikipedia page "Hello"返回的大小为1239字节。请求a page from the haveibeenpwned API会返回554,而不是19942字节的实际大小。

int callback(char* resultPtr, size_t ignore, size_t resultSize) { // resultPtr points to the start of the response, ignore is always 1, resultSize varies
    printf("Response size is %i", resultSize);
    for(int i = 0; i < resultSize; i++) { printf("%c", *(resultPtr+i));} // credit @BartFriederichs
    return 0;
}

int doCurl(char* paramsPtr) {
    char url[43]; // Add space for /0
    CURL *curl = curl_easy_init(); // Initialise cURL
    strcpy(url, "https://api.pwnedpasswords.com/range/"); // Testing URL
    strcat(url, &*paramsPtr); // Always 5 characters
    curl_easy_setopt(curl, CURLOPT_URL, url); // cURL URL set to URL specified above
    curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 120000L); // Tried to set this to make the output longer
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
    curl_easy_perform(curl);
    return 0;
}

此代码的目的是从HIBP的Pwned Passwords API获取响应,并将用户给出的字符串与网页结果进行比较。对于前554个字节(cURL输出的第一块数据)内的任何字符串,搜索成功,但之后失败。

1 个答案:

答案 0 :(得分:3)

签出documentation。它说:

  

回调函数将在所有调用中传递尽可能多的数据,但是您不得做任何假设。它可能是一个字节,也可能是数千个字节。

它没有这么明确地说,但是这个函数可能会被调用多次。您可以使用userdata指针(您尚未使用)来跟踪以前的数据。我建议您也看看example code

struct MemoryStruct {
  char *memory;
  size_t size;
};

static size_t
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
  size_t realsize = size * nmemb;
  struct MemoryStruct *mem = (struct MemoryStruct *)userp;

  char *ptr = realloc(mem->memory, mem->size + realsize + 1);
  if(ptr == NULL) {
    /* out of memory! */ 
    printf("not enough memory (realloc returned NULL)\n");
    return 0;
  }

  mem->memory = ptr;
  memcpy(&(mem->memory[mem->size]), contents, realsize);
  mem->size += realsize;
  mem->memory[mem->size] = 0;

  return realsize;
}