Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кеширующий HTTP прокси сервер на основе IndyHTTPPr 
:(
    Опции темы
cardon
Дата 24.9.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2010

Репутация: нет
Всего: нет



Добрый день пробую написать свой кешируюший прокси.
На данный момент выбрал компонент IndyHttpProxyServer.


Код

procedure TForm1.idhtprxysrvr1HTTPDocument(ASender: TIdHTTPProxyServer;
 const ADocument: String; var VStream: TStream;
 const AHeaders: TIdHeaderList);
var
 i: Integer;
 ext, file_patch, dir_file: String;
 isFileCache: Boolean;
const
 sExt: String = '.jpg.swf.gif.js.css.png.ico';
begin

 file_patch:= ADocument;
 i:= pos('?', file_patch);
 Delete(file_patch, i, Length(file_patch) - i + 1);

 i:= LastPos('.', file_patch);
 ext:= LowerCase( Copy(file_patch, i, Length(file_patch) - i + 1) );

 isFileCache:= pos(ext, sExt) > 0;

 if isFileCache then begin
   dir_file := write_file_cache(file_patch);
   if FileExists(dir_file) then begin
     mmo1.Lines.Add(IntToStr(VStream.Size));
     if VStream.Size > 10 then TMemoryStream(VStream).LoadFromFile(dir_file);
   end else begin
     TMemoryStream(VStream).SaveToFile(dir_file);
   end;
 end;

 if (page_tp = '') and (Pos('srv/user/bpxml?mode=backpack', ADocument) <> 0) then
 begin
//  TMemoryStream(VStream).Read()
 end;
 
end;



Данный код срабатывает на событии OnHTTPDocument.
Но есть несколько подозрений
1) Событие OnHTTPDocument срабатывает когда уже полностью загружен файл из интернета из-за чего смысла в загрузке данных в поток с диска в данном событии смысла нет. Так ли это? Если да то на каком событии пробовать записывать данные в поток с диска чтобы ускорить загрузку?
2) Так же есть подозрение что при сохранении через SaveToFile и загрузке через LoadToFile происходит замедление загрузки страницы т.д. обрабатывается все это не в потоке и ждет последующую загрузку/сохранения файла. Если так то как поправить? Есть идея что сохранять файлы надо каждый в отдельном потоке разбивая файл к примеру на 20 потоков и каждый поток читает к примеру по 50 байт и записывает в один файл. Тоже самое с чтением файла. 20 потоков считывает файл по 50 байт и записывают их в поток. Подскажите по этому поводу.
PM MAIL   Вверх
MetalFan
Дата 24.9.2012, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(cardon @  24.9.2012,  16:05 Найти цитируемый пост)
Но есть несколько подозрений

а что мешает открыть исходники индей и/или под отладкой посмотреть, что там когда загружается?
по п.2  - совершенно бесполезная оптимизация, имхо. уж прочитать/записать оптимальне, чем это делает ОС, врядли получится.
А кеш "самых" популярных файлов можно вообще в памяти держать


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
cardon
Дата 24.9.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.12.2010

Репутация: нет
Всего: нет



Спасибо понял. По поводу пункта 2. А если вынести SaveToFile и LoadToFile в отдельные потоки то ускориться ли загрузка страницы? На сколько знаю браузер одновременно передает загрузку нескольких файлов. А в моем случае они получаеться будут стоять в очереди(так ли это?) и ждать когда получим последующий файл. По этому и хочеться ускорить.
Под отладкой мешает посмотреть знания ) По этому и прошу совета тут.
Не могу понять где записывать данные в поток VStream. В OnHTTPDocument похоже это делать не рационально т.к. там уже готовый файл лежить в Vstream. Значит надо подменивать его до того как он там окажется.  Так понимаю надо или создавать Handler и привязываеть его и в нем уже это все подменивать или же в событии OnBeforeHandler. И тем более как потом отдать это дело браузеру и отменить загрузку с сервера. 

Кто знает подскажите.

Это сообщение отредактировал(а) cardon - 24.9.2012, 19:04
PM MAIL   Вверх
MetalFan
Дата 24.9.2012, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Судя по сорцам индей, что идут с DXE (10.5.7), отменить загрузку с сервера назначения запроса никак нельзя. Перед вызовом OnHTTPDocument сначала происходит чтение ответа на запрос с сервера назначения, а потом этот результат передается в OnHTTPDocument, где может быть модифицирован.
Единственный на мой взгляд вариант - переписать индей немного под свои нужды. Например: добавить событие ПЕРЕД чтением ответа от внешнего сервера и при необходимости не делать это чтение...

Добавлено @ 21:46
Цитата(cardon @  24.9.2012,  18:42 Найти цитируемый пост)
По поводу пункта 2.

Не надо ничего колхозить. на сколько я понимаю, каждый OnHTTPDocument выполняется в отдельном потоке.

Это сообщение отредактировал(а) MetalFan - 24.9.2012, 21:50


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.