【问题标题】:Send User-Agent through CONNECT and POST with WinHTTP?使用 WinHTTP 通过 CONNECT 和 POST 发送用户代理?
【发布时间】:2010-03-07 14:22:32
【问题描述】:

我正在尝试使用 WinHttp 发布到安全站点,但遇到了用户代理标头未与 CONNECT 一起发送的问题。

我正在使用 MSDN 中经过轻微修改的代码示例:

  HINTERNET hHttpSession = NULL;
  HINTERNET hConnect     = NULL;
  HINTERNET hRequest     = NULL;

  WINHTTP_AUTOPROXY_OPTIONS  AutoProxyOptions;
  WINHTTP_PROXY_INFO         ProxyInfo;
  DWORD                      cbProxyInfoSize = sizeof(ProxyInfo);

  ZeroMemory( &AutoProxyOptions, sizeof(AutoProxyOptions) );
  ZeroMemory( &ProxyInfo, sizeof(ProxyInfo) );

  hHttpSession = WinHttpOpen(L"WinHTTP AutoProxy Sample/1.0",
    WINHTTP_ACCESS_TYPE_NO_PROXY,
    WINHTTP_NO_PROXY_NAME,
    WINHTTP_NO_PROXY_BYPASS,
    0);

  if(!hHttpSession)
    goto Exit;

  hConnect = WinHttpConnect( hHttpSession,
    L"server.com",
    INTERNET_DEFAULT_HTTPS_PORT,
    0 );

  if( !hConnect )
    goto Exit;

  hRequest = WinHttpOpenRequest(hConnect, L"POST", L"/resource", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE );

  if( !hRequest )
    goto Exit;

  WINHTTP_PROXY_INFO proxyInfo;
  proxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
  proxyInfo.lpszProxy = L"192.168.1.2:3199";
  proxyInfo.lpszProxyBypass = L"";

  WinHttpSetOption(hHttpSession,
    WINHTTP_OPTION_PROXY,
    &proxyInfo,
    sizeof(proxyInfo));

  WinHttpSetCredentials(hRequest, WINHTTP_AUTH_TARGET_PROXY, WINHTTP_AUTH_SCHEME_BASIC, L"proxyuser", L"proxypass", NULL);

  if( !WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, "content", 7, 7, 0))
  {
    goto Exit;
  }

  if(!WinHttpReceiveResponse(hRequest, NULL))
    goto Exit;

    /* handle result */

Exit:

  if( ProxyInfo.lpszProxy != NULL )
    GlobalFree(ProxyInfo.lpszProxy);

  if( ProxyInfo.lpszProxyBypass != NULL )
    GlobalFree( ProxyInfo.lpszProxyBypass );

  if( hRequest != NULL )
    WinHttpCloseHandle( hRequest );

  if( hConnect != NULL )
    WinHttpCloseHandle( hConnect );

  if( hHttpSession != NULL )
    WinHttpCloseHandle( hHttpSession );

这样做是通过 192.168.1.2:3199 上的经过身份验证的代理连接到我的服务器,然后进行 POST。这可行,但是当我检查代理日志时,用户代理字符串(“WinHTTP AutoProxy Sample/1.0”)没有作为 CONNECT 的一部分发送。然而,它是作为 POST 的一部分发送的。

有人可以告诉我如何更改此代码以在 CONNECT 和 POST 期间发送 User-Agent 标头吗?

编辑添加:我们只在 Windows 7 上观察到这个问题。如果我们在 Windows Vista 机器上运行相同的代码,我们可以看到 User-Agent标头正在 CONNECT 上发送。

【问题讨论】:

    标签: ssl proxy user-agent connect winhttp


    【解决方案1】:

    Duncan-- 根据 WinHTTP 团队的说法,这是在 Windows 7 中引入的行为更改。目前,WinHTTP 中没有解决此问题的方法。

    【讨论】:

    • 非常感谢。以为我疯了一段时间:-)
    • Eric,自从我发布这个问题以来,我们不得不重新设计我们的软件以使用 HTTP 而不是 HTTPS,因为我们被基于用户过滤的公司网络中的过滤代理拒绝了-代理人。如果你与他们有联系,请让 WinHTTP 团队知道这对我们来说是一个痛苦的问题,他们越早修复这个回归(抱歉,行为改变)对所有 Windows 开发人员来说就越好.
    • Duncan:您应该联系 Microsoft 支持 (support.microsoft.com) 并为此提交案例;这是获得 Microsoft 发布的修复程序的途径。由于这是我们行为的改变,因此应免除支持费用。
    • Eric:我试着给澳大利亚的微软打电话 (13-16-30),被一个粗鲁、霸道的 CSR 告知,提交报告需要花费数百美元,没有办法收费将被免除,如果我和他说话,他的主管也会说同样的话。总而言之,当我花费自己的时间通过报告我已经找到解决方法的缺陷来提供帮助时,这不是我所期望的。
    • 仅供参考,对于关注此问题的任何人,美国的 Microsoft 人员会在 24 小时内与我们取得联系,对给您带来的不便表示歉意,并免费提出问题。我又是一个快乐的露营者了:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2018-06-15
    • 2016-03-05
    • 2013-07-21
    • 2011-02-18
    相关资源
    最近更新 更多