WinHTTP 请求收到 407 之后,使用 WinHttpQueryAuthSchemes 检查对方提供的方法,并选择客户端与账户都支持的一种。在该请求上设置凭据:

WinHttpSetCredentials(
    requestHandle,
    WINHTTP_AUTH_TARGET_PROXY,
    selectedScheme,
    proxyUser,
    proxyPassword,
    nullptr);

最后一个保留参数必须为 null。检查布尔返回值,失败时查看 GetLastError。成功只表示 API 接受了该设置,并不表示代理接受了登录。

通过受控的身份验证流程重新发送,并检查响应。限制重试次数;如果重复该操作,已经消费过的请求正文流必须能够重放。目标返回的 401 使用 WINHTTP_AUTH_TARGET_SERVER,与本处的代理目标不同。

这些凭据只对单个请求生效。WinHTTP 不会把它们变成供后续请求使用的通用凭据存储。复用的已通过身份验证的连接可能暂时掩盖另一次质询,因此应用程序仍必须处理未来的质询。

把代理选择单独处理。带凭据的地址字符串不能取代这个请求句柄 API,正如成功抵达端点并不等于完成身份验证。

相关文章