Пишу кеширующий проки на Delphi за основу взят компонент IndyHttpProxyServer. На событии OnHTTPDocument код Code: procedure TForm1.idhtprxysrvr1HTTPDocument(ASender: TIdHTTPProxyServer; const ADocument: String; var VStream: TStream; const AHeaders: TIdHeaderList); var i :integer; file_patch:string; dir_file : string; begin if (Pos('.jpg', ADocument) <> 0) or (Pos('.swf', ADocument) <> 0) or (Pos('.gif', ADocument) <> 0) or (Pos('.js', ADocument) <> 0) or (Pos('.css', ADocument) <> 0) or (Pos('.ico', ADocument) <> 0) or (Pos('.png', ADocument) <> 0) then begin i := Pos('?', ADocument); if (i <> 0) then begin file_patch := Copy(ADocument, 0 , i-1); dir_file := write_file_cache(file_patch); if (FileExists(dir_file)) then begin mmo2.Lines.Add(dir_file); TMemoryStream(VStream).LoadFromFile(dir_file); end else begin mmo1.Lines.Add(dir_file); TMemoryStream(VStream).SaveToFile(dir_file); end; end else begin dir_file := write_file_cache(ADocument); if (FileExists(dir_file)) then begin mmo2.Lines.Add(dir_file); TMemoryStream(VStream).LoadFromFile(dir_file); end else begin mmo1.Lines.Add(dir_file); TMemoryStream(VStream).SaveToFile(dir_file); end; end; end; end; Если в браузере нет кеша то все хорошо работает и ошибки нету. Но вот если в браузере существует кеш с файлами которые он заново загружен вылазиет ошибка. Ошибка "Socket Error #10053 Software caused connection abort." Так понимаю это происходит потому что он прокси кидает отмену соединения и подгружает данный файл из кеша. Подскажите как убрать данную ошибку. Так понимаю надо прописать try finally. В общем исключение надо прописать. Но не могу понять где именно.
на счет ошибки хз, но вот процу бы переделал и убрал из нее дублирующийся код примерно так: Code: function LastPos(Needle: Char; Haystack: String): integer; begin for Result := Length(Haystack) downto 1 do if Haystack[Result] = Needle then Break; end; 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 mmo2.Lines.Add(dir_file); TMemoryStream(VStream).LoadFromFile(dir_file); end else begin mmo1.Lines.Add(dir_file); TMemoryStream(VStream).SaveToFile(dir_file); end; end; end;
cardons, места где используется, IndyHttpProxyServer, оберни в try Code: except on EidException //Ловим базоыый класс Indy искл. соответственно все Indyшные begin log.write('.......'); end; Как-то так, вот типы искл. в Indy http://masteroid.ru/content/view/1146/43/.
Проблему полностью решил ) Вопрос к знатокам. Если обрабатывать в отдельных потоках Code: TMemoryStream(VStream).LoadFromFile(dir_file); и Code: TMemoryStream(VStream).SaveToFile(dir_file); увеличиться ли скорость чтения и записи в поток ProxyServer'а? Ведь по сути файл то в потоке Vstream получен полностью но вот на запись и чтение тратиться время из-за чего приложение подлагивает. Хотя скорее всего быстро будет работать не через LoadFromFile и SaveTOFile а создать функции в которых будет узнаваться размер файла/потока и на 10 потоков разбивать его чтения и запись в поток и из потока.