2010-03-07 59 views
1

我正在尝试使用WinHttp发布到安全站点,并且遇到了User-Agent头未与CONNECT一起发送的问题。通过CONNECT发送用户代理并用WinHTTP POST?

我使用的是轻修改后的代码示例从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。这是有效的,但是当我检查代理日志时,User-Agent字符串(“WinHTTP AutoProxy Sample/1.0”)不作为CONNECT的一部分发送。然而,它是作为POST的一部分发送的。

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

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

回答

2

邓肯 - 根据WinHTTP团队,这是在Windows 7中引入的行为改变。目前,在WinHTTP中没有针对此问题的解决方法。

+0

非常感谢。以为我疯了一会儿:-) – 2010-03-10 23:30:59

+0

Eric,因为我发布了这个问题,我们不得不重新设计我们的软件来使用HTTP而不是HTTPS,因为我们被公司网络中的过滤代理所拒绝,用户代理的基础。如果您与他们保持联系,请让WinHTTP团队知道这对我们来说是一个正确的痛苦,他们越早得到这种回归(对不起,行为改变)对所有Windows开发人员来说都更好。 – 2010-03-15 13:33:06

+0

Duncan:您应联系Microsoft支持部门(http://support.microsoft.com)并获取相关案例;这是获得微软发布修补程序的途径。由于这是我们行为的改变,应该免除支持费用。 – EricLaw 2010-03-15 17:23:31