Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Кеширующий 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.084 c
15-1346265576
Artem
2012-08-29 22:39
2013.03.22
Почему не отображается диалог?Помогите, пожалуйста


2-1328170170
AV
2012-02-02 12:09
2013.03.22
Запрос к MSSSQL не возвращает данные. Почему?


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


15-1334228111
Unknown user
2012-04-12 14:55
2013.03.22
Файл-контейнер с сигнатурой pstorage


15-1352827685
Artem
2012-11-13 21:28
2013.03.22
Можно вопрос про графы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский