function GetProxyInfo(
const AURL:
string;
var AProxy, AProxyBypass:
string): Boolean;
var
LAutoDetectProxy: Boolean;
LpProxyConfig: PWinHTTPCurrentUserIEProxyConfig;
LWinHttpProxyInfo: TWinHTTPProxyInfo;
LAutoProxyOptions: TWinHTTPAutoProxyOptions;
begin
Result := True;
AProxy := '
';
AProxyBypass := '
';
FillChar(LAutoProxyOptions, SizeOf(LAutoProxyOptions), 0);
LpProxyConfig := TWinHttpLib.GetProxyConfig;
if LpProxyConfig <>
nil then
begin
if LpProxyConfig^.fAutoDetect
then
begin
LAutoProxyOptions.dwFlags := WINHTTP_AUTOPROXY_AUTO_DETECT;
LAutoProxyOptions.dwAutoDetectFlags := WINHTTP_AUTO_DETECT_TYPE_DHCP
or WINHTTP_AUTO_DETECT_TYPE_DNS_A;
// *** Obwohl die AutoDetect in der Proxy-Konfig aktiv ist, bleibt LAutoDetectProxy auf False! ***
end;
if LpProxyConfig^.lpszAutoConfigURL <> '
'
then
begin
LAutoProxyOptions.dwFlags := WINHTTP_AUTOPROXY_CONFIG_URL;
LAutoProxyOptions.lpszAutoConfigUrl := LpProxyConfig^.lpszAutoConfigUrl;
LAutoDetectProxy := True;
end
else
begin
// *** Wenn keine "AutoConfig"-URL angegeben ist, landet der Code hier,
// *** auch wenn in der ProxyConfig "AutoDetect" angegeben ist. Dadurch
// *** wird dann versucht, einen direkt eingestellten Proxy zu nehmen,
// *** auch wenn keiner eingestellt ist. LAutoDetectProxy bleibt auf False.
AProxy := LpProxyConfig^.lpszProxy;
AProxyBypass := LpProxyConfig^.lpszProxyBypass;
LAutoDetectProxy := False;
end;
end
else
begin
// if the proxy configuration is not found then try to autodetect it (If the Internet Explorer settings are not configured for system accounts)
LAutoProxyOptions.dwFlags := WINHTTP_AUTOPROXY_AUTO_DETECT;
LAutoProxyOptions.dwAutoDetectFlags := WINHTTP_AUTO_DETECT_TYPE_DHCP
or WINHTTP_AUTO_DETECT_TYPE_DNS_A;
LAutoDetectProxy := True;
end;
if (AProxy = '
')
and LAutoDetectProxy
then
begin
// *** Eigentlich müssten wir hier landen, aber wegen der falschen Abfragen oben, landen wir
// *** nie hier. Folge: die entscheidende Funktion aus der WinHTTP-API, nämlich
// *** WinHttpGetProxyForUrl wird nie aufgerufen!
// From https://msdn.microsoft.com/en-us/library/aa383153%28VS.85%29.aspx
// Try with fAutoLogonIfChallenged parameter set to false, if ERROR_WINHTTP_LOGIN_FAILURE then try
// with fAutoLogonIfChallenged parameter set to true.
LAutoProxyOptions.fAutoLogonIfChallenged := False;
if WinHttpGetProxyForUrl(LClient.FWSession, LPCWSTR(AURL), LAutoProxyOptions, LWinHttpProxyInfo)
then
begin
AProxy := LWinHttpProxyInfo.lpszProxy;
AProxyBypass := LWinHttpProxyInfo.lpszProxyBypass;
end
else
begin
if GetLastError = ERROR_WINHTTP_LOGIN_FAILURE
then
begin
LAutoProxyOptions.fAutoLogonIfChallenged := True;
if WinHttpGetProxyForUrl(LClient.FWSession, LPCWSTR(AURL), LAutoProxyOptions, LWinHttpProxyInfo)
then
begin
AProxy := LWinHttpProxyInfo.lpszProxy;
AProxyBypass := LWinHttpProxyInfo.lpszProxyBypass;
end
else
Result := False;
end
else
Result := False;
end;
end;
if AProxy = '
'
then
Result := False;
end;