Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IdHTTPProxyServer и размер ресурса


Страницы:   1 2

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 (и с указанием размера в заголовках), клиент должен показывать табличку :)
Прокси-сервер тут ни причем. Хотя табличку может показывать и он, но тогда это не будет иметь отношения к клиенту, собственно скачивающему этот файл. Да и не дело это для сервера - таблички показывать :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо