如何在每个http包中发送libcurl发送摘要认证头?

我有以下函数http_send_message()我每次想要发送一条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句柄以进行后续调用,以充分利用持久连接和摘要访问身份validation请求计数器:

[…]客户端可以发出另一个请求,重用服务器nonce值(服务器只为每个“401”响应发出一个新的nonce)但提供一个新的客户端nonce(cnonce)。 对于后续请求,hex请求计数器(nc)必须大于它使用的最后一个值

在练习中不要清理你的卷发手柄。 而是在需要执行另一个请求时立即维护它:

  • 使用curl_easy_reset函数重置它: curl_easy_reset(curl);
  • 然后重新设置你的选择。

如果您使用CURLOPT_VERBOSE选项,您将看到对于后续请求,您将拥有一个带有递增请求计数器的Authorization标头( nc=00000002nc=00000003等)。