![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IdHTTPProxyServer и размер ресурса
kernel © (2008-07-01 20:06:00)Доброго времени суток, уважаемые.
Бьюсь вторые сутки над "выдачей" информации о файле перед скачиванием через "испеченный" мною на основе IdHTTPProxyServer прокси сервере.
Т.е. при скачивании файла через свой прокси, например, с помощью IE, должно сначала появиться окно, в котором мне будет хотя бы известен размер файла, после чего, в случае моего согласия, файл скачивается. Так вот дело в том, что мне не известен размер файла, пока сам этот файл не скачается полностью (например, в IE окошко сохранения файла появляется после полного скачивания этого файла), хотя без прокси все нормально. В самом прокси я передаю в заголовке ответа Content-Length, после чего само тело файла.
Кто-нибудь знает, как устранить эту проблемку?
ЗЫ: извиняюсь, если что-то коряво написал - у меня уже ночь, голова не соображает :)
umbra (2008-07-02 13:38:00) [21]
> Почему то браузер не просит информацию о ресурсе HEAD`ом
а чего он должен ее просить? не для этого его делали :)
Надо писат плагин/надстройку. Непонятно только, причем здесь прокси.
kernel (2008-07-02 13:19:00) [22]
> Поросенок Винни-Пух © (02.07.08 12:58) [4]
>
> да у него в дизайне кода проблема.
> получив ссылку от браузера он пока его на прокси не выкачает,
> к передаче обратно в браузер не переходит.
Вообще IdHTTPProxyServer читает требуемые данные в Stream с запрашиваемого сервера, затем отсылает это браузеру. Но заголовок ответа (включая Content-Length) отсылается серверу до сбрасывания данных в/из stream:
{Например, при обработке GET: }
var
LClient: TIdTCPClient;
LDocument: string;
LHeaders: TIdHeaderList;
LRemoteHeaders: TIdHeaderList;
LURI: TIdURI;
LPageSize: Integer;
begin
ASender.PerformReply := false;
LHeaders := TIdHeaderList.Create; try
ASender.Context.Connection.IOHandler.Capture(LHeaders, '');
LClient := TIdTCPClient.Create(nil); try
LURI := TIdURI.Create(ASender.Params.Strings[0]); try
LClient.Port := Sys.StrToInt(LURI.Port, 80);
LClient.Host := LURI.Host;
//We have to remove the host and port from the request
LDocument := LURI.Path + LURI.Document + LURI.Params;
finally Sys.FreeAndNil(LURI); end;
LClient.Connect; try
LClient.IOHandler.WriteLn('GET ' + LDocument + ' HTTP/1.0'); {Do not Localize}
LClient.IOHandler.Write(LHeaders);
LClient.IOHandler.WriteLn('');
LRemoteHeaders := TIdHeaderList.Create; try
LClient.IOHandler.Capture(LRemoteHeaders, '');
// вот заголовок отправляется: ==============================
ASender.Context.Connection.IOHandler.Write(LRemoteHeaders);
ASender.Context.Connection.IOHandler.WriteLn('');
// ======================================================
LPageSize := Sys.StrToInt(LRemoteHeaders.Values['Content-Length'], -1) ; {Do not Localize}
// вот ресурс отправляется: ================================
TransferData(LClient, ASender.Context.Connection, LDocument, LPageSize, LRemoteHeaders);
// ======================================================
finally Sys.FreeAndNil(LRemoteHeaders); end;
finally LClient.Disconnect; end;
finally Sys.FreeAndNil(LClient); end;
finally Sys.FreeAndNil(LHeaders); end;
> umbra © (02.07.08 12:35) [3]
>
> в принципе есть запрос HEAD, предназначенный для получения
> информации о ресурсе. Прокси может слать сначала его, показывать
> табличку :) (хотя и не его это дело), а потом уже, в зависимости
> от реакции пользователя, слать или не слать GET
Почему то браузер не просит информацию о ресурсе HEAD`ом. Я даже сам настоятельно ему отправлял эту информацию, не спрашивая у него разрешения - не помогло :)
Поросенок Винни-Пух (2008-07-02 13:00:00) [23]этож какие таймауты надо разрешать в браузере чтобы через такой замечательный прокси качать что-нибуть большее чем testgirl.jpg в 100 кб
Поросенок Винни-Пух (2008-07-02 12:58:00) [24]да у него в дизайне кода проблема.
получив ссылку от браузера он пока его на прокси не выкачает, к передаче обратно в браузер не переходит.
umbra (2008-07-02 12:35:00) [25]в принципе есть запрос HEAD, предназначенный для получения информации о ресурсе. Прокси может слать сначала его, показывать табличку :) (хотя и не его это дело), а потом уже, в зависимости от реакции пользователя, слать или не слать GET
Поросенок Винни-Пух (2008-07-01 23:51:00) [26](например, в IE окошко сохранения файла появляется после полного скачивания этого файла),
ну это ты сам так написал свой прокси.
umbra (2008-07-01 23:44:00) [27]
> Т.е. при скачивании файла через свой прокси, например, с
> помощью IE, должно сначала появиться окно, в котором мне
> будет хотя бы известен размер файла, после чего, в случае
> моего согласия, файл скачивается.
Тут дело не в прокси-сервере, а в клиенте. Т.е. при получении ответа с кодом 200 (и с указанием размера в заголовках), клиент должен показывать табличку :)
Прокси-сервер тут ни причем. Хотя табличку может показывать и он, но тогда это не будет иметь отношения к клиенту, собственно скачивающему этот файл. Да и не дело это для сервера - таблички показывать :)