Ошибка в IndyHttpProxyServer [Delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by cardons, 13 Sep 2012.

  1. cardons

    cardons Elder - Старейшина

    Joined:
    19 Jul 2005
    Messages:
    778
    Likes Received:
    324
    Reputations:
    83
    Пишу кеширующий проки на 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. В общем исключение надо прописать. Но не могу понять где именно.
     
  2. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    на счет ошибки хз, но вот процу бы переделал и убрал из нее дублирующийся код примерно так:
    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;
    
     
  3. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    cardons, места где используется, IndyHttpProxyServer, оберни в try
    Code:
    except 
       on EidException //Ловим базоыый класс Indy искл. соответственно все Indyшные
       begin
           log.write('.......');
       end;
    Как-то так, вот типы искл. в Indy http://masteroid.ru/content/view/1146/43/.
     
  4. cardons

    cardons Elder - Старейшина

    Joined:
    19 Jul 2005
    Messages:
    778
    Likes Received:
    324
    Reputations:
    83
    Проблему полностью решил ) Вопрос к знатокам. Если обрабатывать в отдельных потоках
    Code:
              TMemoryStream(VStream).LoadFromFile(dir_file);
    и
    Code:
    TMemoryStream(VStream).SaveToFile(dir_file);
    увеличиться ли скорость чтения и записи в поток ProxyServer'а? Ведь по сути файл то в потоке Vstream получен полностью но вот на запись и чтение тратиться время из-за чего приложение подлагивает.

    Хотя скорее всего быстро будет работать не через LoadFromFile и SaveTOFile а создать функции в которых будет узнаваться размер файла/потока и на 10 потоков разбивать его чтения и запись в поток и из потока.
     
    #4 cardons, 17 Sep 2012
    Last edited: 17 Sep 2012