Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> indy Проблема с таймаутом 
:(
    Опции темы
oboldei
Дата 28.1.2011, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



Решил написать функцию для чека 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;


PM MAIL   Вверх
MetalFan
Дата 28.1.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
oboldei
Дата 28.1.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



Цитата(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. А обработчик не срабатывает.
Если не трудно, закомпилируй у себя. Может поймёшь где моя ошибка. Потому что на теории должно работать, а на дели облом((.
PM MAIL   Вверх
MetalFan
Дата 28.1.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
oboldei
Дата 28.1.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



Цитата(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;

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

Это сообщение отредактировал(а) oboldei - 28.1.2011, 15:19
PM MAIL   Вверх
MetalFan
Дата 28.1.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(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

Это сообщение отредактировал(а) MetalFan - 28.1.2011, 23:05


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
oboldei
Дата 29.1.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



Цитата(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 не моё)). У меня с ней всегда проблемы. Только чего стоит её обработка русских символов в ответе "??????".
PM MAIL   Вверх
MetalFan
Дата 29.1.2011, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



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

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

Это сообщение отредактировал(а) MetalFan - 29.1.2011, 18:02


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.