2016-05-30 28 views
1

我正在实现一个C程序,它需要从Content-Length头文件(当在响应头文件中发送Content-Length时)读取远程文件的大小。如何使用CURLOPT_HEADERFUNCTION读取单个响应标题字段?

我已经看过libcurl的文档,并且迄今为止能够提供的最好功能是CURLOPT_HEADERFUNCTION设置的回调函数。我已经把一个回调,这是应该打印头以STDOUT的玩具实施:

size_t hdf(char* b, size_t size, size_t nitems, void *userdata) { 
    printf("%s", b); 
    return 0; 
} 

虽然我希望能够打印Content-Length头(或者,至少,所有打印头),我只能得到这个功能打印响应代码:

$ ./curltest "some_url_which_sends_back_Content_Length" 
HTTP/1.1 200 OK 

如果我注释掉我main这台回调上面定义的hdf功能行,默认行为是打印所有的头到STDOUT

仅供参考,这里是main功能我使用的基础上,libcurl的邮件列表上线:

int main(int argc, char *argv[]) 
{ 
    CURLcode ret; 
    CURL *hnd = curl_easy_init(); 
    curl_easy_setopt(hnd, CURLOPT_URL, argv[1]); 
    curl_easy_setopt(hnd, CURLOPT_HEADER, 1); 
    curl_easy_setopt(hnd, CURLOPT_NOBODY, 1); 
    curl_easy_setopt(hnd, CURLOPT_HEADERFUNCTION, hdf); 
    ret = curl_easy_perform(hnd); 
    curl_easy_cleanup(hnd); 
} 

我怎么能写的CURLOPT_HEADERFUNCTION选项的回调,可以加载一个特定的头进入内存或以其他方式操作 - 或者至少将所有头文件加载到内存中?

回答

4

我只能得到这个功能打印响应代码:

这个问题的答案是CURLOPT_HEADERFUNCTION文档中:尽快

此功能得到由libcurl中被称为它已收到标题数据。标题回调将为每个标题调用一次,只有完整的标题行传递给回调。使用这个解析头文件非常简单。 缓冲区指向的数据的大小是乘以nmemb的大小。不要认为标题行是零终止!名为userdata的指针是您使用CURLOPT_HEADERDATA选项设置的指针。 这个回调函数必须返回实际需要处理的字节数。如果该数量与传递给您函数的数量不同,它会向库发出错误信号。这将导致传输中止,并且正在进行的libcurl函数将返回CURLE_WRITE_ERROR

printf()通话假设空终止,并且您的回调将返回比提供更少的字节,所以收到的第一个响应行后你是中止的响应。

试试这个。

size_t hdf(char* b, size_t size, size_t nitems, void *userdata) { 
    size_t numbytes = size * nitems; 
    printf("%.*s\n", numbytes, b); 
    return numbytes; 
} 

我怎么能写上可在特定头加载到内存中或以其他方式操纵它的CURLOPT_HEADERFUNCTION选项回调 - 或者,至少,所有的标题加载到内存?

修复bug后,您应该可以看到所有标题。然后,您可以解析b查找Content-Length标题,并在找到时将其数据保存到缓冲区,然后通过CURLOPT_HEADERDATA传递给userdata

现在,就是说,有一种更简单的方法来检索Content-Length值。执行HEAD请求与curl_easy_perform()CURLOPT_NOBODY),如果成功不是使用curl_easy_getinfo()检索CURLINFO_CONTENT_LENGTH_DOWNLOAD值:

CURLINFO_CONTENT_LENGTH_DOWNLOAD
从Content-Length头内容长度。

+0

噢,我必须更多关注文档。感谢您的解释! – Jules

相关问题