Funkce AutoProxy WinHTTP
WinHTTP implementuje protokol WPAD pomocí funkce WinHttpGetProxyForUrl spolu se dvěma podpůrnými nástrojovými funkcemi, WinHttpDetectAutoProxyConfigUrl a WinHttpGetIEProxyConfigForCurrentUser.
Podpora AutoProxy není plně integrovaná do zásobníku HTTP ve Službě WinHTTP. Před odesláním požadavku musí aplikace volat WinHttpGetProxyForUrl získat název proxy serveru a potom volat WinHttpSetOption pomocí WINHTTP_OPTION_PROXY nastavit konfiguraci proxy na obslužné rutině požadavku WinHTTP vytvořené WinHttpOpenRequest.
Funkce WinHttpGetProxyForUrl může provést všechny tři kroky protokolu WPAD popsaného v předchozím přehledu: (1) zjistit adresu URL PAC ( 2) stáhnout soubor skriptu PAC , (3) spustit kód skriptu a vrátit konfiguraci proxy serveru ve struktuře WINHTTP_PROXY_INFO. Pokud aplikace předem zná adresu URL PAC, může ji zadat pro WinHttpGetProxyForUrl.
Následující příklad kódu používá autoproxy. Nastaví požadavek HTTP GET tak, že nejprve vytvoří připojení relace WinHTTP a zpracovává žádosti. Volání WinHttpOpen určuje WINHTTP_ACCESS_TYPE_NO_PROXY pro počáteční konfiguraci proxy serveru, aby bylo možné indikovat, že se požadavky ve výchozím nastavení odesílají přímo na cílový server. Pomocí autoproxy pak nastaví konfiguraci proxy serveru přímo na popisovač požadavku.
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) );
//
// Create the WinHTTP session.
//
hHttpSession = WinHttpOpen( L"WinHTTP AutoProxy Sample/1.0",
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0 );
// Exit if WinHttpOpen failed.
if( !hHttpSession )
goto Exit;
//
// Create the WinHTTP connect handle.
//
hConnect = WinHttpConnect( hHttpSession,
L"www.microsoft.com",
INTERNET_DEFAULT_HTTP_PORT,
0 );
// Exit if WinHttpConnect failed.
if( !hConnect )
goto Exit;
//
// Create the HTTP request handle.
//
hRequest = WinHttpOpenRequest( hConnect,
L"GET",
L"ms.htm",
L"HTTP/1.1",
WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
0 );
// Exit if WinHttpOpenRequest failed.
if( !hRequest )
goto Exit;
//
// Set up the autoproxy call.
//
// Use auto-detection because the Proxy
// Auto-Config URL is not known.
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
// Use DHCP and DNS-based auto-detection.
AutoProxyOptions.dwAutoDetectFlags =
WINHTTP_AUTO_DETECT_TYPE_DHCP |
WINHTTP_AUTO_DETECT_TYPE_DNS_A;
// If obtaining the PAC script requires NTLM/Negotiate
// authentication, then automatically supply the client
// domain credentials.
AutoProxyOptions.fAutoLogonIfChallenged = TRUE;
//
// Call WinHttpGetProxyForUrl with our target URL. If
// auto-proxy succeeds, then set the proxy info on the
// request handle. If auto-proxy fails, ignore the error
// and attempt to send the HTTP request directly to the
// target server (using the default WINHTTP_ACCESS_TYPE_NO_PROXY
// configuration, which the requesthandle will inherit
// from the session).
//
if( WinHttpGetProxyForUrl( hHttpSession,
L"https://www.microsoft.com/ms.htm",
&AutoProxyOptions,
&ProxyInfo))
{
// A proxy configuration was found, set it on the
// request handle.
if( !WinHttpSetOption( hRequest,
WINHTTP_OPTION_PROXY,
&ProxyInfo,
cbProxyInfoSize ) )
{
// Exit if setting the proxy info failed.
goto Exit;
}
}
//
// Send the request.
//
if( !WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0,
WINHTTP_NO_REQUEST_DATA,
0,
0,
NULL ) )
{
// Exit if WinHttpSendRequest failed.
goto Exit;
}
//
// Wait for the response.
//
if( !WinHttpReceiveResponse( hRequest, NULL ) )
goto Exit;
//
// A response has been received, then process it.
// (omitted)
//
Exit:
//
// Clean up the WINHTTP_PROXY_INFO structure.
//
if( ProxyInfo.lpszProxy != NULL )
GlobalFree(ProxyInfo.lpszProxy);
if( ProxyInfo.lpszProxyBypass != NULL )
GlobalFree( ProxyInfo.lpszProxyBypass );
//
// Close the WinHTTP handles.
//
if( hRequest != NULL )
WinHttpCloseHandle( hRequest );
if( hConnect != NULL )
WinHttpCloseHandle( hConnect );
if( hHttpSession != NULL )
WinHttpCloseHandle( hHttpSession );
V zadaném ukázkovém kódu volání WinHttpGetProxyForUrl dává funkci pokyn, aby automaticky objevila soubor automatické konfigurace proxy serveru zadáním příznaku WINHTTP_AUTOPROXY_AUTO_DETECT ve struktuře WINHTTP_AUTOPROXY_OPTIONS. Použití příznaku WINHTTP_AUTOPROXY_AUTO_DETECT vyžaduje, aby kód určil jeden nebo oba příznaky automatické detekce (WINHTTP_AUTO_DETECT_TYPE_DHCP, WINHTTP_AUTO_DETECT_TYPE_DNS_A). Ukázkový kód používá funkci automatického zjišťování WinHttpGetProxyForUrl, protože adresa URL PAC není předem známa. Pokud v tomto scénáři nejde najít adresu URL PAC, WinHttpGetProxyForUrl selže (GetLastError vrátí ERROR_WINHTTP_AUTODETECTION_FAILED).
Pokud je adresa URL PAC známa předem
Pokud aplikace zná adresu URL PAC, může ji zadat ve struktuře WINHTTP_AUTOPROXY_OPTIONS a nakonfigurovat WinHttpGetProxyForUrl přeskočit fázi automatického zjišťování.
Pokud je například soubor PAC dostupný v místní síti na adrese URL, "https://InternalSite/proxy-config.pac", volání WinHttpGetProxyForUrl by vypadalo následovně.
//
// Set up the autoproxy call.
//
// The proxy auto-config URL is known. Auto-detection
// is not required.
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
// Set the proxy auto-config URL.
AutoProxyOptions. lpszAutoConfigUrl = L"https://InternalSite/proxy-config.pac";
// If obtaining the PAC script requires NTLM/Negotiate
// authentication, then automatically supply the client
// domain credentials.
AutoProxyOptions.fAutoLogonIfChallenged = TRUE;
//
// Call WinHttpGetProxyForUrl with our target URL. If auto-proxy
// succeeds, then set the proxy info on the request handle.
// If auto-proxy fails, ignore the error and attempt to send the
// HTTP request directly to the target server (using the default
// WINHTTP_ACCESS_TYPE_NO_PROXY configuration, which the request
// handle will inherit from the session).
//
if( WinHttpGetProxyForUrl( hHttpSession,
L"https://www.microsoft.com/ms.htm",
&AutoProxyOptions,
&ProxyInfo ) )
{
//...
Pokud WINHTTP_AUTOPROXY_OPTIONS struktura určuje příznaky WINHTTP_AUTOPROXY_AUTO_DETECT i WINHTTP_AUTOPROXY_CONFIG_URL (a určuje příznaky automatického detctionu a adresu URL automatické konfigurace), WinHttpGetProxyForUrl první pokus o automatické zjišťování a pokud se automatické zjišťování nepodaří najít adresu URL PAC, vrátí se zpět na adresu URL automatické konfigurace, kterou aplikace poskytuje.
Funkce WinHttpDetectAutoProxyConfigUrl
Funkce WinHttpDetectAutoProxyConfigUrl implementuje podmnožinu protokolu WPAD: pokouší se automaticky rozpoznat adresu URL pro soubor automatické konfigurace proxy serveru bez stažení nebo spuštění souboru PAC. Tato funkce je užitečná ve zvláštních situacích, kdy webová klientská aplikace musí zpracovávat stahování a spouštění samotného souboru PAC.
Funkce WinHttpGetIEProxyConfigForCurrentUser
Funkce WinHttpGetIEProxyConfigForCurrentUser vrátí nastavení proxy serveru aplikace Internet Explorer aktuálního uživatele pro aktuální aktivní síťové připojení bez volání doWinInet.dll. Tato funkce je užitečná pouze v případě, že je volána v rámci procesu, který běží pod interaktivní identitou uživatelského účtu, protože není pravděpodobně k dispozici žádná konfigurace proxy aplikace Internet Explorer jinak. Například by nebylo užitečné volat tuto funkci z knihovny DLL ISAPI spuštěné v procesu služby IIS. Další informace a scénář, ve kterém by aplikace založená na WinHTTP používala WinHttpGetIEProxyConfigForCurrentUser, naleznete v tématu Zjišťování bez automatické konfigurace souboru.