Використання проксі в програмі

262
Зараз покажу, як треба використовувати різні типи проксі в запитах на Indy. Проксі будемо брати з Edit1 і ділити на адресу і порт.
Найпростіше це використовувати HTTP-проксі:

IdHTTP1.ProxyParams.ProxyServer:=Copy(Edit1.Text,1,Pos(‘:’,Edit1.Text)-1);
IdHTTP1.ProxyParams.ProxyPort:=StrToInt(Copy(Edit1.Text,Pos(‘:’,Edit1.Text)
+1,Length(Edit1.Text)));

Все гранично зрозуміло і просто.

Для використання SOCKS4 і SOCKS5 крім компонента IdHTTP1 потрібні компонент IdSocksInfo (вкладка Indy Misc) і компонент IdSSLIOHandlerSocketOpenSSL (вкладка Indy I/O Handlers).
У IdSocksInfo вказуємо тип проксі (svSocks4 або svSocks5), адресу і порт, а також виставляємо властивість Authentication в saNoAuthentication:

IdSocksInfo1.Версія:=svSocks4;
IdSocksInfo1.Host:=Copy(Edit1.Text,1,Pos(‘:’,Edit1.Text)-1);
IdSocksInfo1.Port:=StrToInt(Copy(Edit1.Text,Pos(‘:’,Edit1.Text)+1,
Length(Edit1.Text)));
IdSocksInfo1.Authentication:= saNoAuthentication;

І приєднуємо IdSocksInfo1 до IdSSLIOHandlerSocketOpenSSL1, а IdSSLIOHandlerSocketOpenSSL1 до IdHTTP1:

IdSSLIOHandlerSocketOpenSSL1.TransparentProxy:=IdSocksInfo1;
IdHTTP1.IOHandler:=IdSSLIOHandlerSocketOpenSSL1;

Після цього можна робити запит. Запит я робив на сторінку moi-ip.ru, де на сторінці відображається IP запитуваного. І парсим з відповіді IP-адресу, який виводимо в Memo. Якщо все вірно і проксі хороший, то використовується проксі і виведений в Memo повинні співпасти.

В якості бонусу в програмі показано, як можна показувати прогрес отримання відповіді сервера. Він відображається у вікні Gauge (можна також використовувати ProgressBar). На самому початку запиту (IdHTTP1WorkBegin) з заголовків відповіді сервера з поля Content-Length беремо довжину одержуваного відповіді (звертаю увагу, що такого заголовка може не бути, а значить не завжди можна знати, якої довжини буде відповідь). І властивості MaxValue присвоюємо значення:

Gauge1.MaxValue:=strtoint(Pars(‘Content-Length: ‘, idhttp1.Response.RawHeaders.Text, #13#10));

А під час отримання відповіді (IdHTTP1Work) (а приходить він частинами) змінюємо властивість Progress:

Gauge1.Progress:=AWorkCount;

В результаті у нас буде наочне зображення прогресу завантаження сторінки.

[Завантажити] оригінал взято з avtuh.ru