Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2016, 15:12   #1
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию Не работает proxy для IdHTTP

Добрый день.

Есть класс потока:

Код:
constructor Thread.Create(CreateSuspended: Boolean);
begin
  inherited;
  Form1.ThreadList.Add(Self);
  IdHTTP := TIdHTTP.Create(nil);
  IdHTTP.CookieManager := TIdCookieManager.Create();
  IdHTTP.Compressor := TIdCompressorZLib.Create();

  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(); 
  IdHTTP.HandleRedirects := true;
  IdHTTP.AllowCookies := true;
end;

function Thread.GetProxy: Boolean;
var
  proxy: string;
begin
  with Form1 do          
  begin
    try
      CS_PROXY.Enter;

        if ProxyList.Count > 0 then
        begin
          try
            Socks5.Free;
            Socks5 := TIdSocksInfo.Create();                    
            Socks5.Version := svSocks5;
            Socks5.Authentication:= saNoAuthentication;

            IdHTTP.ReadTimeout := 30000;
            IdHTTP.ConnectTimeout := 30000;

            proxy := ProxyList[0];
            ProxyList.Delete(0);
            Socks5.Host := Copy(proxy,1,Pos(':',proxy)-1);
            Socks5.Port:= StrToInt( Copy(proxy,Pos(':',proxy)+1,Length(proxy)) );
            Socks5.Enabled := True;

            IOHandler.TransparentProxy := Socks5;

            Result := true;
          except
            Result := false;
          end;
        end
          else Result := false;
    finally
      CS_PROXY.Leave;
    end;
  end;
end;

procedure Thread.Execute;
var
  CheckStatus, Email: string;
  i, j: integer;
begin
  inherited;
  while WORK do
  begin
    if not GetProxy then
    begin
      Form1.Label21.Caption := 'Закончились proxy';
      exit;
    end;
    for i := 1 to CheckCount do
    begin
      Email := GetEmail;
      if Email <> 'EMPTY' then
      begin
        for j := 1 to 5 do
        begin
          CheckStatus := Check(Email);
          if Pos('ERROR', CheckStatus) = 0 then
          begin
            UpdateStatistics(Email, CheckStatus);
            break;
          end
          else if Pos('BLOCK', CheckStatus) > 0 then
          begin
            Form1.CS_BLOCK.Enter;
              Form1.Label23.Caption := IntToStr(StrToInt(Form1.Label23.Caption) + 1);
              AddEmail(Email);
            Form1.CS_BLOCK.Leave;
            break;
          end;
        end;
      end
      else
        Exit;
    end;
    Sleep(500);
  end;
end;
Код просто не пашет, и я не могу понять, почему.
IdHTTP не видит прокси и работает напрямую.

Ребята, помогите разобраться с IdSocksInfo.

Последний раз редактировалось greenisius; 08.05.2016 в 15:17.
greenisius вне форума Ответить с цитированием
Старый 08.05.2016, 15:26   #2
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию

Да, и если вывалить весь хлам из function Thread.GetProxy в конструктор, работает нормально, а в таком варианте как у меня не работает. Похоже, IdHTTP просто не видит Socks5 или то, что я кладу в сокс куда-то теряется.
greenisius вне форума Ответить с цитированием
Старый 09.05.2016, 12:43   #3
greenisius
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 67
По умолчанию

Пишу, если кто-то столкнется с такой проблемой.

В очередной раз проблема заключается в кривизне Indy.

Решить проблему можно путем удаления компонентов IOHandler и IdSocksInfo в функции GetProxy, и создания заново.

Код:
constructor Thread.Create(CreateSuspended: Boolean);
begin
  inherited;
  Form1.ThreadList.Add(Self);
  IdHTTP := TIdHTTP.Create();
  IdHTTP.CookieManager := TIdCookieManager.Create();
  IdHTTP.Compressor := TIdCompressorZLib.Create();

  IdHTTP.HandleRedirects := true;
  IdHTTP.AllowCookies := true;
end;

function Thread.GetProxy: Boolean;
var
  proxy: string;
begin
  with Form1 do           
  begin
    try
      CS_PROXY.Enter;


        if ProxyList.Count > 0 then
        begin
          try
            IOHandlerSSL.Free;
            Socks5.Free;

            IOHandlerSSL := TIdSSLIOHandlerSocketOpenSSL.Create();
            IdHTTP.IOHandler := IOHandlerSSL;

            Socks5 := TIdSocksInfo.Create();
            Socks5.Version := svSocks5;
            Socks5.Authentication:= saNoAuthentication;

            IdHTTP.ReadTimeout := 10000;
            IdHTTP.ConnectTimeout := 10000;

            Socks5.Enabled := True;

            proxy := ProxyList[0];
            ProxyList.Delete(0);
            Socks5.Host := Copy(proxy,1,Pos(':',proxy)-1);
            Socks5.Port:= StrToInt( Copy(proxy,Pos(':',proxy)+1,Length(proxy)) );
            Socks5.Enabled := true;

            IOHandlerSSL.TransparentProxy := Socks5;

            Result := true;
          except
            Result := false;
          end;
        end
          else Result := false;
    finally
      CS_PROXY.Leave;
    end;
  end;
end;
greenisius вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подвисает idhttp в потоке + proxy record222 Работа с сетью в Delphi 0 25.07.2012 16:29
не работает POST IdHTTP silent_lab Работа с сетью в Delphi 10 19.12.2011 08:27
Как работает передача данных в IdHTTP? Alamo Работа с сетью в Delphi 5 18.05.2010 16:00
IdHTTP и Proxy nikoleg85 Работа с сетью в Delphi 4 07.12.2009 14:54