我每次要发送http消息时都会使用以下函数http_send_message()
:
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消息时,它会尝试发送没有摘要认证头的请求,然后使用摘要认证头发送它。在正常情况下,它应该仅在第一条消息中执行此行为。对于后续消息,它应记住认证标头并在每条消息中发送
答案 0 :(得分:3)
要获得此类行为,您需要重新使用卷曲句柄以便后续调用充分利用持久连接和Digest Access Authentication请求计数器:
[...]客户端可以发出另一个请求,重用服务器nonce值(服务器只为每个“401”响应发出一个新的nonce),但提供一个新的客户端nonce(cnonce)。对于后续请求,十六进制请求计数器(nc)必须大于它使用的最后一个值
在练习中不要清理你的卷发手柄。而是在需要执行另一个请求时立即维护它:
curl_easy_reset(curl);
如果您使用CURLOPT_VERBOSE
选项,您会看到对于后续请求,您将拥有一个Authorization
标头,其中包含不断增加的请求计数器nc=00000002
,nc=00000003
等)。