Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > indy Проблема с таймаутом


Автор: oboldei 28.1.2011, 00:46
Решил написать функцию для чека proxy. Когда таймаут большой + прокси жив то всё нормально работает. Ну если прокси не активен либо срабатывает таймаут. Вылетает исключительная ситуация EIdHTTPProtocolException. Моя обработка не срабатывает(((  

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type
 E = class(Exception);
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    tid:array [0..999] of integer;

implementation

{$R *.dfm}

function Prox:boolean;
var 
    HTTP:TIdHTTP;
    a:string;
begin
 HTTP:=TIdHTTP.Create(nil);
 HTTP.AllowCookies:=true;
 HTTP.HandleRedirects  :=  True;
 HTTP.ReadTimeout:=1000;
 HTTP.ProxyParams.ProxyServer:='89.21.22.44';
 HTTP.ProxyParams.ProxyPort:=8118;
 try
    HTTP.Get('http://www.1gb.ua/phpinfo.php');
 except
   on E: EIdHTTPProtocolException do
     begin
       HTTP.Free;
     end;
  end;
  if http.ResponseCode=200  then result:=true
  else result:=false;
 HTTP.Free;
end;


Автор: MetalFan 28.1.2011, 10:00
oboldei
Еще не плохо б ConnectionTimeout выставить...
ну и код написан криво. Сработает обработчик EIdHTTPProtocolException, убьет HTTP, а дальше к нему опять обращения...

Автор: oboldei 28.1.2011, 12:47
Цитата(MetalFan @ 28.1.2011,  10:00)
oboldei
Еще не плохо б ConnectionTimeout выставить...
ну и код написан криво. Сработает обработчик EIdHTTPProtocolException, убьет HTTP, а дальше к нему опять обращения...

1. ConnectionTimeout=1000 ставил. Результат тодже.
2. В том то и дело что обработчик события EIdHTTPProtocolException не срабатывает.
3. Ну и что как HTTP.Free это ведь функция. После повторного вызова я снова её создам HTTP:=TIdHTTP.Create(nil);. Ну если очень надо можно так result:=false;

Пробема ведь остаётся. Когда прокси мёртвый или не успевает прогрузится. Идёт ошибка EIdHTTPProtocolException. А обработчик не срабатывает.
Если не трудно, закомпилируй у себя. Может поймёшь где моя ошибка. Потому что на теории должно работать, а на дели облом((.

Автор: MetalFan 28.1.2011, 13:37
этого не может быть потому, что этого не может быть.
Если вываливается EIdHTTPProtocolException, то она должна быть обработана в данном случае.

3. Какая нафиг функция? После повторного вызова Free получишь в лучшем случае Access Violation.

Автор: oboldei 28.1.2011, 15:17
Цитата(MetalFan @ 28.1.2011,  13:37)
этого не может быть потому, что этого не может быть.
Если вываливается EIdHTTPProtocolException, то она должна быть обработана в данном случае.

3. Какая нафиг функция? После повторного вызова Free получишь в лучшем случае Access Violation.

Окей. Закомпилируй. Это минута дела. И сделай запрос.  А потом умничать будешь. Этого не может быть и бла, бла.

 
Код

type E = class(Exception);

function Prox:boolean;
var 
    HTTP:TIdHTTP;
    a:string;
begin
 HTTP:=TIdHTTP.Create(nil);
 HTTP.AllowCookies:=true;
 HTTP.HandleRedirects  :=  True;
 HTTP.ReadTimeout:=1000;
 HTTP.ConnectTimeout:=1000;
 HTTP.ProxyParams.ProxyServer:='89.21.22.44';
 HTTP.ProxyParams.ProxyPort:=8118;
 try
    HTTP.Get('http://www.1gb.ua/phpinfo.php');
 except
   on E: EIdHTTPProtocolException do
     begin
       result:=false;
     end;
  end;
  if http.ResponseCode=200  then result:=true
  else result:=false;
 HTTP.Free;
end;



В кнопку кинь что то вроде этого:
Код

begin
 if Prox=true then
   Memo1.Lines.Add('ок')
 else
   fMemo1.Lines.Add('Всё плохо шеф')
 end;

Если сработает "ок". Жми ещё раз)) Со второго раза точно сработает таймаут)).

Автор: MetalFan 28.1.2011, 22:47
Цитата(oboldei @  28.1.2011,  15:17 Найти цитируемый пост)
type E = class(Exception);

а это что за творчество?
прекрасно отрабатывает такой код:
Код

function CheckProxy( Address: string; Port: DWORD ): Boolean;
var
  HTTP: TIdHTTP;
begin
 HTTP:=TIdHTTP.Create(nil);
 try
   HTTP.AllowCookies:=true;
   HTTP.HandleRedirects  :=  True;
   HTTP.ReadTimeout:=1000;
   HTTP.ConnectTimeout:=1000;
   HTTP.ProxyParams.ProxyServer := Address;
   HTTP.ProxyParams.ProxyPort   := Port;
   try
      HTTP.Get('http://www.1gb.ua/phpinfo.php');
   except
       Exit( False );
   end;
   Result := http.ResponseCode=200;
 finally
   HTTP.Free;
 end;
end;

DXE, Indy 10.5.7

Автор: oboldei 29.1.2011, 12:36
Цитата(MetalFan @ 28.1.2011,  22:47)
Цитата(oboldei @  28.1.2011,  15:17 Найти цитируемый пост)
type E = class(Exception);

а это что за творчество?
прекрасно отрабатывает такой код:
Код

function CheckProxy( Address: string; Port: DWORD ): Boolean;
var
  HTTP: TIdHTTP;
begin
 HTTP:=TIdHTTP.Create(nil);
 try
   HTTP.AllowCookies:=true;
   HTTP.HandleRedirects  :=  True;
   HTTP.ReadTimeout:=1000;
   HTTP.ConnectTimeout:=1000;
   HTTP.ProxyParams.ProxyServer := Address;
   HTTP.ProxyParams.ProxyPort   := Port;
   try
      HTTP.Get('http://www.1gb.ua/phpinfo.php');
   except
       Exit( False );
   end;
   Result := http.ResponseCode=200;
 finally
   HTTP.Free;
 end;
end;

DXE, Indy 10.5.7

СПС. Поверю наслово. Я уже сделал на своём любимом Synapse. Indy не моё)). У меня с ней всегда проблемы. Только чего стоит её обработка русских символов в ответе "??????".

Автор: MetalFan 29.1.2011, 16:16
Цитата(oboldei @  29.1.2011,  12:36 Найти цитируемый пост)
Поверю наслово.

а мне как-то параллельно, поверишь или нет...
а synapse действительно рулит для несложных задач)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)