2016-01-29 5 views
1

Я использую библиотеку Winhttp.lib для отправки HTTP-запроса на C++ на удаленный сервер.Код для отправки HTTP-запроса через прокси-сервер с использованием WinHttp

На стороне клиента HTTP-запрос должен быть отправлен в прокси-сервер, IP-адрес которого составляет W.X.Y.Z, а какой порт - 1234.

Согласно прототипу функции WinHttpOpen() (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384098%28v=vs.85%29.aspx), , в частности, параметры dwAccessType, pwszProxyName и pwszProxyBypass, это выглядит, как это функция, которая должна быть сказано о доверенности.

Как сообщить функции WinHttpOpen(), что прокси для отправки HTTP-запроса является (IP = W.X.Y.Z, PORT = 1234)?

Структура WINHTTP_PROXY_INFO (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383912%28v=vs.85%29.aspx) выглядит интересной, но я знаю, как ее использовать в сочетании с WinHttpOpen().

спасибо.

ответ

1

Вы пробовали WinHttpSetOption с флагом WINHTTP_OPTION_PROXY? Это будет выглядеть примерно так:

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 и PORT прокси-сервера известны. Но, возможно, это не так, как работает WinHttp ... –

+0

Я расширил свой первоначальный вопрос о том, пытались ли вы WinHttpSetOption установить прокси для вашей сессии, чтобы сделать его более полезным. Я попробовал это сейчас, и это, казалось, сработало (хотя на самом деле у меня нет законного прокси-сервера ... поэтому мой тест заключался в том, что я не мог получить доступ к веб-сайту после того, как я установил параметр). – fleebness

+0

Хотя я не уверен, что вы точно подразумеваете под «законным прокси», я не думаю, что у меня его есть: Я установил прокси-сервер SQUID на одной из машин (P) в своей локальной сети.Машина, которая запускает код WinHttp, является другой машиной (C) в локальной сети. Удаленная машина (S). Мне нужно (C) отправить HTTP-запрос на (S), но запрос должен быть отправлен прокси (P), который отправит его (S). –

0

Вы могли бы также рассмотреть эту страницу на MSDN:

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

Он имеет полный пример работы с прокси, который безопаснее, чем один, который я представил ранее, так как он не отправляет имя пользователя/пароли в ясный, если я правильно понимаю API.

Они рекомендуют использовать WinHttpSetCredentials с WINHTTP_AUTH_TARGET_PROXY на дескрипторе запроса (а не на дескрипторе сеанса). Для этого вам нужно предоставить WinHttpSetCredentials схему аутентификации, которую вы хотите. WinHttpQueryAuthSchemes может помочь вам в этом.

Обратите внимание, что пример кода находится в цикле ... первый запрос на страницу может дать вам код состояния, который указывает, что вам необходимо предоставить прокси-аутентификацию (407), и должен обладать желаемой аутентификацией. Последующий запрос может использовать желаемую схему аутентификации.