每次发送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=00000002nc=00000003,等等)。

10-07 19:03
查看更多