Sem tam potřebuji stáhnout jednoduchý soubor z webu. Většinou to dělám za pomocí Synapse a nějaké procedury z jednotky httpsend. Člověk ale musí navíc dělat opičky kolem zjišťování proxy - buďto z registru (HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings) nebo za pomocí jednotky ze synapse SynaMisc a procedury GetIEProxy.
Ale zdá se mi, že v případě autokonfigurace proxy ani jeden ze způsobů nefunguje. Existuje ještě možnost stažení souboru přes WinInet, což je součást instalace IE (resp. nyní nejen IE) a používá to část IE a tak je velká šance že to projde přes různé filtry (teda doufám).
Budu se navíc maskovat za IE9 (viz konstanta csAgent), případně si vyberte vlastního agenta na www.whoishostingthis.com/tools/user-agent/. Kód je částečně opravený kód z internetu, používám ho v Delphi XE.
Konstanta INTERNET_OPEN_TYPE_PRECONFIG zaručuje, že se použije nastavení z IE, dále je možno zvolit přímé připojení atd. Ale toto by měla být tutovka. Není to žádný rychlostní zázrak, ale na určité věci to stačí.
Nevýhodou je závislost na další knihovně, která je sice prakticky standardní i ve Wine - ale člověk nikdy neví.
uses
WinInet;
const
csAgent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;
WOW64; Trident/5.0)2011-10-16 20:21:07';
function msDownloadFile(const Url: string): Ansistring;
var
NetHandle: HINTERNET;
UrlHandle: HINTERNET;
Buffer: array[0..1024] of AnsiChar;
BytesRead: dWord;
begin
Result := '';
NetHandle := InternetOpen(csAgent, INTERNET_OPEN_TYPE_PRECONFIG,
nil, nil, 0);
if Assigned(NetHandle) then
begin
UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0,
INTERNET_FLAG_RELOAD, 0);
if Assigned(UrlHandle) then
begin
FillChar(Buffer, SizeOf(Buffer), 0);
repeat
FillChar(Buffer, SizeOf(Buffer), 0);
InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
Result := Result + Copy (Buffer, 1, BytesRead);
until BytesRead = 0;
InternetCloseHandle(UrlHandle);
end
else
{ UrlHandle is not valid. Raise an exception. }
raise Exception.CreateFmt('Cannot open URL %s', [Url]);
InternetCloseHandle(NetHandle);
end
else
{ NetHandle is not valid. Raise an exception }
raise Exception.Create('Unable to initialize Wininet');
end;