2010-03-07 60 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