2016-01-29 153 views
1

我正在使用Winhttp.lib庫以C++向遠程服務器發送HTTP請求。使用WinHttp通過代理髮送HTTP請求的代碼

在客戶端,HTTP請求必須發送到IP爲W.X.Y.Z和哪個端口爲1234的代理。

根據功能WinHttpOpen()https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx)的原型, 特別是參數dwAccessTypepwszProxyNamepwszProxyBypass,看起來這是一個必須被告知有關代理的功能。

我該如何告訴WinHttpOpen()函數發送HTTP請求的代理是​​?

結構WINHTTP_PROXY_INFOhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx)看起來很有趣,但我知道如何結合WinHttpOpen()使用它。

謝謝。

回答

1

你有沒有用WINHTTP_OPTION_PROXY標誌試過WinHttpSetOption?它看起來大致是這樣的:

hSession = WinHttpOpen(L"WinHTTP Example/1.0", 
     WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, 
     WINHTTP_NO_PROXY_NAME, 
     WINHTTP_NO_PROXY_BYPASS, 0);   
    WINHTTP_PROXY_INFO proxy = { 0 }; 
    proxy.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY; 
    proxy.lpszProxy = L"http://127.0.0.1:1234;http://blarg.com:4545"; 
    if (!WinHttpSetOption(hSession, WINHTTP_OPTION_PROXY, &proxy, sizeof(proxy))) 
    { 
     wprintf(L"Unable to set proxy.\n"); 
    } 
    else 
    { 
     HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL, 
      WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); 
     char* username = "username"; 
     WinHttpSetOption(hRequest, WINHTTP_OPTION_PROXY_USERNAME, username, strlen(username)); 
     WinHttpSetOption(hRequest, WINHTTP_OPTION_PROXY_PASSWORD, password, strlen(password)); 

     [ ... ] 
    } 

上面將設置您使用兩個代理... 127.0.0.1:1234,並blarg.com:4545會話。如果需要,您也可以使用https更改方案。它將使用WINHTTP_OPTION_PROXY_USERNAME和WINHTTP_OPTION_PROXY_PASSWORD選項爲代理用戶名和密碼設置參數。

請注意我已經執行了幾乎沒有錯誤檢查。通常,你會希望確保選擇很正確設置等

+0

謝謝你的回答。我只想堅持知道代理的IP和端口的事實。但是,也許這不是WinHttp的工作方式...... –

+0

我已經擴展了我的原始問題,即您是否嘗試過使用WinHttpSetOption爲會話設置代理,以使其更有幫助。 我試了一下剛纔,它似乎工作(雖然我實際上沒有一個合法的代理...所以我的測試涉及看到後,我設置的選項我無法訪問網站)。 – fleebness

+0

雖然我不知道什麼你到底是「合法的代理」的意思是,我不認爲我有一個或者: 我安裝了Squid代理在我的局域網的機器(P)中的一個。運行WinHttp代碼的機器是LAN中的另一臺機器(C)。 遠程機器是(S)。我需要(C)向(S)發送一個HTTP請求,但是請求必須發送給代理(P),代理將把它發送給(S)。 –

0

你也可以考慮這個頁面上MSDN:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384100(v=vs.85).aspx

它與代理工作的一個完整的例子是不是更安全我之前介紹過的一個,因爲如果我正確理解API,它不會以明文形式發送用戶名/密碼。

他們建議使用手柄上的請求(不是會話的句柄)與WINHTTP_AUTH_TARGET_PROXY WinHttpSetCredentials。爲此,您需要爲WinHttpSetCredentials提供所需的身份驗證方案。 WinHttpQueryAuthSchemes可以幫助你做到這一點。

注意,示例代碼是在一個循環中...頁面的第一個請求可能會給你一個狀態代碼,表示您需要提供代理認證(407),並且應具備它所需要的一種認證方式。隨後的請求可以使用所需的認證方案。