我正在尝试使用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输出的第一块数据)内的任何字符串,搜索成功,但之后失败。
答案 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;
}