Хочется наконец внести полную и окончательную ясность в этот вопрос... Как с помощью TIdHTTP скачать файл из-за файервола или прокси сервера, требующего авторизации? Казалось бы всё просто, однако не получается. В связи с чем была написана коротенькая утилитка для тестирования, которая только и умеет, что скачивать заданный файл с заданными параметрами прокси.
Т.е. для скачки напрямую, надо делать так:
C:\FileDownload.exe http://tut.url.com/file.ext
А для скачки через прокси/файервол — так:
C:\FileDownload.exe http://tut.url.com/file.ext proxy port username password
Вот, собственно, код:
program FileDownload;
{$APPTYPE CONSOLE}
uses
SysUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, Classes;
var HTTP: TIdHTTP;
FStream: TFileStream;
begin
// allocate resources
HTTP:=TIdHTTP.Create(Nil);
FStream:=TFileStream.Create('downloaded.dat', fmCreate);
// get params
if ParamCount=5 then
with HTTP.ProxyParams do begin
ProxyServer:=ParamStr(2);
ProxyPort:=StrToInt(ParamStr(3));
ProxyUsername:=ParamStr(4);
ProxyPassword:=ParamStr(5);
end; //with
// try downloading the specified file
try
HTTP.Get(ParamStr(1), FStream);
except
on E: Exception do WriteLn(E.Message);
end; //try..except
// clean-up
FStream.Free;
HTTP.Free;
end.
Скчать его можно
здесь, в скомпиллированном виде —
здесь.
С помощью этого чудо-софта было констатировано вот что: скачка без прокси и файерволов происходит на ура, однако при попытке слить файл из-за файервола, получаем такой вот аутпут:
HTTP/1.0 407 Proxy Authentication Required
Внимание, вопрос: теперь-то что? Куда ещё ему этот username/password запихать? Насколько я понял из RFC по HTTP, запрос нужно повторить, да только это почему-то не помогает... Что же я недопонял? Что именно нужно вставить в этот код, чтобы всё работало?
Здравствуйте, Firstborn, Вы писали:
[]
F>F>HTTP/1.0 407 Proxy Authentication Required
F>Внимание, вопрос: теперь-то что? Куда ещё ему этот username/password запихать? Насколько я понял из RFC по HTTP, запрос нужно повторить, да только это почему-то не помогает... Что же я недопонял? Что именно нужно вставить в этот код, чтобы всё работало?
Ну так повтори запрос, добавив заголовок Authorization или Proxy-Authorization в валидном формате. В чем проблема-то?
за фаерволом многие вещи могут обрезаться собственно фаерволом, а также порта отличные от 80 и 21 могут быть наглухо закрыты. Почему не коннектится через прокси с паролем
Здравствуйте, Firstborn, Вы писали:
F>>Ну так повтори запрос, добавив заголовок Authorization или Proxy-Authorization в валидном формате. В чем проблема-то?
F>Пример?
Пример запроса?
GET /index.html HTTP/1.1
Host: www.somehost.com
Accept: */*
Authorization: Basic base64_encoded_data_here
Пример Basic-авторизации. В общем, в RFC все довольно подробно описано.