Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Кеширующий HTTP прокси сервер на основе IndyHTTPProxyServer   Найти похожие ветки 

 
Дениска   (2012-09-24 17:01) [0]

Добрый день пробую написать свой кешируюший прокси.
На данный момент выбрал компонент 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 байт и записывают их в поток. Подскажите по этому поводу.


 
sniknik ©   (2012-09-24 17:44) [1]

читать предварительно по протоколу head, и смотреть там дату документа? ... если есть, должно в принципе, для чего то же оно используется....


 
sniknik ©   (2012-09-24 17:47) [2]

кстати в заголовках "обычного" запроса документа должен быть срок его действия (/истечения после чего нужен пере запрос)


 
Дениска   (2012-09-24 19:40) [3]

Мне дата собственно не нужна) Причем тут вообще дата собственно? ) Мне вне зависимости надо заменить. Другой вопрос где это делать и как. В OnHTTPDocument похоже это делать не рационально т.к. там уже готовый файл лежить в Vstream. Значит надо подменивать его до того как он там окажется.


 
sniknik ©   (2012-09-24 21:40) [4]

> Причем тут вообще дата собственно?
в ней "время" локальной жизни документа определяемое сервером. ну или что-то типа.

> Другой вопрос где это делать и как.
как, это как раз не вопрос. изучить протокол/почитать про готовые реализации, что от чего зависит. оценить и запрограммировать свой велосипед.


 
sniknik ©   (2012-09-24 21:42) [5]

p.s. поставь мозилу + firebug или httpfox и последи за работой... браузер тоже "кеширующий прокси", сам для себя.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.055 c
2-1333830083
Den
2012-04-08 00:21
2013.03.22
заранее задать размер строки Setlength ?


2-1337350435
LDV
2012-05-18 18:13
2013.03.22
DblClick на кнопке


2-1329332051
Zheksonz
2012-02-15 22:54
2013.03.22
Быстрое сохранение параметров в файл


15-1328990843
bootleger
2012-02-12 00:07
2013.03.22
Проверка существования ф-ла в интернете


15-1329597005
Юрий
2012-02-19 00:30
2013.03.22
С днем рождения ! 19 февраля 2012 воскресенье