Подружим idhttp, idsocksinfo и idssliohandlersocketopenssl

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Пуховой, 16 Jan 2010.

  1. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    Проблема работы с ssl через socks в indy наблюдается давно. Сколько бы не лазил на форумах – никому без геморроя не удавалось подружить 3 компоненты, дабы они работали более или менее корректно. Поэтому пришлось связывать самому.

    Используемое:

    - Delphi 2010 update 5
    - Indy 10.5.7, последняя доступная ревизия
    - SSL библиотеки из последних, приложу в посте

    Прежде чем приведу код функции тестирования прокси для работы с ssl через socks 4/4a/5 версий, напомню, что нужно добавить в uses для использования данной функции:

    - idhttp
    - idcookiemanager
    - idsslopenssl
    - idcompressorzlib
    - idsocks

    idcookiemanager мы добавили на всякий случай – вдруг вы захотите проверять установку кукисов (некоторые прокси не отдают оные). idcompressorzlib – для экономии трафика (не увлекаться, даже на мощных серверах способна загрузить систему на все 120%).

    Code:
    function test_socks (proxyadr : string) : boolean;
    var
      http : tidhttp;
      coo : tidcookiemanager;
      ssl : tidssliohandlersocketopenssl;
      compressor : tidcompressorzlib;
      sock : tidsocksinfo;
    begin
      result := false;
      coo := tidcookiemanager.create;
      ssl := tidssliohandlersocketopenssl.create; ssl.ssloptions.method := sslvtlsv1; ssl.port := 443;
      http := tidhttp.create; http.iohandler := ssl; http.readtimeout := 60000; http.connecttimeout := 60000; http.allowcookies := true; http.handleredirects := false; http.cookiemanager := coo; http.request.useragent := 'mozilla/4.0 (compatible; msie 7.0; windows nt 6.0)'; http.request.acceptencoding := 'gzip, deflate';
      sock := tidsocksinfo.create; sock.authentication := sanoauthentication; sock.version := svsocks5; sock.host := copy (proxyadr, 1, pos (':', proxyadr) - 1); sock.port := strtoint (copy (proxyadr, pos (':', proxyadr) + 1, 5)); ssl.transparentproxy := sock;
      compressor := tidcompressorzlib.create; http.compressor := compressor;
      try
        if pos ('О компании', http.get ('https://passport.yandex.ru/passport?mode=passport'))  0 then result := true;
      except end;
      http.free; coo.free; compressor.free; ssl.free; sock.free;
    end;
    Читать далее
     
    5 people like this.
  2. оlbaneс

    оlbaneс Moderator

    Joined:
    5 Nov 2007
    Messages:
    1,362
    Likes Received:
    1,041
    Reputations:
    356
    пух, кажись ты свой сайт пиаришь. м?
     
    _________________________
  3. GlooK

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

    Joined:
    20 Apr 2007
    Messages:
    172
    Likes Received:
    53
    Reputations:
    10
    indy не есть гуд.
    максимум что себе позволяю wininet.
    все остальное считаю глючным и медленным,
    а что самое главное не прозрачным для понимания и разбора.
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Пиарит или не пиарит, - не имеет значения.
    Информация полезная.

    Спасибо тебе!
     
  5. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    оlbaneс, вы меня раскусили :) На самом деле - несколько раз сталкивался с подобной проблемой и с отсутствием материала / исходников по ней. Наконец решил опубликовать, чего наделал, вдруг полезно будет :)