每次发送http消息时,我都使用以下函数:
http_send_message(char *msg_out, char **msg_in)
{
CURLcode res;
CURL *curl;
curl = curl_easy_init();
if (!curl) return -1;
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.133:8080/tawtaw");
curl_easy_setopt(curl, CURLOPT_USERNAME, "tawtaw");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "tawtaw");
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
.
.
.
curl_easy_cleanup(curl);
}
但我注意到,每次函数发送http消息时,它都会尝试发送一个没有摘要身份验证头的请求,然后再发送带有摘要身份验证头的请求。在正常情况下,它应该只在第一条消息中执行此行为。对于随后的消息,它应该记住身份验证头并在每个消息中发送它
最佳答案
要获得这样的行为,您需要对后续调用重新使用curl handle,以充分利用持久连接和Digest Access Authentication请求计数器:
[…]客户端可以发出另一个请求,重用服务器nonce值(服务器只为每个“401”响应发出一个新nonce),但提供一个新的客户端nonce(cnonce)。对于后续请求,十六进制请求计数器(nc)必须大于它使用的最后一个值
在实践中不要清理你的卷发柄。相反,只要您需要执行另一个请求,请维护它:
使用curl_easy_reset功能重置它:curl_easy_reset(curl);
然后重新设置选项。
如果您使用CURLOPT_VERBOSE
选项,您将看到对于随后的请求,您将有一个Authorization
头,其请求计数器不断增加(nc=00000002
,nc=00000003
,等等)。