如何在每个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=00000002
, nc=00000003
等)。