Proxies in Delphi/Pascal
Delphi and Free Pascal remain popular for developing Windows applications. Working with proxies is done through the Indy (Delphi standard), Synapse, and WinINet API libraries.
Indy (Internet Direct)
Indy is Delphi's built-in library for network programming.
HTTP Proxy
uses IdHTTP, IdSSLOpenSSL;
procedure FetchViaProxy;
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
HTTP := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
HTTP.IOHandler := SSL;
// Proxy configuration
HTTP.ProxyParams.ProxyServer := 'proxy_ip';
HTTP.ProxyParams.ProxyPort := 8080;
HTTP.ProxyParams.ProxyUsername := 'username';
HTTP.ProxyParams.ProxyPassword := 'password';
HTTP.ProxyParams.BasicAuthentication := True;
WriteLn(HTTP.Get('https://httpbin.org/ip'));
finally
SSL.Free;
HTTP.Free;
end;
end;
SOCKS5 Proxy via Indy
uses IdHTTP, IdSocks, IdSSLOpenSSL;
procedure FetchViaSocks5;
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Socks: TIdSocksInfo;
begin
HTTP := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Socks := TIdSocksInfo.Create(nil);
try
// SOCKS5 configuration
Socks.Host := 'proxy_ip';
Socks.Port := 1080;
Socks.Version := svSocks5;
Socks.Username := 'username';
Socks.Password := 'password';
Socks.Authentication := saUsernamePassword;
SSL.TransparentProxy := Socks;
HTTP.IOHandler := SSL;
WriteLn(HTTP.Get('https://httpbin.org/ip'));
finally
Socks.Free;
SSL.Free;
HTTP.Free;
end;
end;
SOCKS4
Socks.Version := svSocks4;
// SOCKS4 does not support authentication
Socks.Authentication := saNoAuthentication;
Synapse
Synapse is an alternative network library for Free Pascal and Delphi.
Installation
Download from synapse.ararat.cz and add to your project.
HTTP Proxy
uses httpsend;
procedure FetchViaSynapseProxy;
var
HTTP: THTTPSend;
begin
HTTP := THTTPSend.Create;
try
HTTP.ProxyHost := 'proxy_ip';
HTTP.ProxyPort := '8080';
HTTP.ProxyUser := 'username';
HTTP.ProxyPass := 'password';
if HTTP.HTTPMethod('GET', 'https://httpbin.org/ip') then
WriteLn(HTTP.Document.DataString)
else
WriteLn('Error: ', HTTP.ResultCode);
finally
HTTP.Free;
end;
end;
SOCKS via Synapse
uses blcksock;
procedure FetchViaSynapseSocks;
var
Sock: TTCPBlockSocket;
begin
Sock := TTCPBlockSocket.Create;
try
Sock.SocksIP := 'proxy_ip';
Sock.SocksPort := '1080';
Sock.SocksUsername := 'username';
Sock.SocksPassword := 'password';
Sock.SocksType := ST_Socks5;
Sock.Connect('httpbin.org', '80');
if Sock.LastError = 0 then begin
Sock.SendString('GET /ip HTTP/1.1' + #13#10 +
'Host: httpbin.org' + #13#10 +
#13#10);
WriteLn(Sock.RecvString(10000));
end;
finally
Sock.Free;
end;
end;
WinINet API (Windows)
Using the system Windows API:
uses WinInet;
procedure FetchViaWinINet;
var
hInternet, hConnect: HINTERNET;
Buffer: array[0..4095] of Char;
BytesRead: DWORD;
begin
// Open with proxy
hInternet := InternetOpen(
'MyApp',
INTERNET_OPEN_TYPE_PROXY,
PChar('http://proxy_ip:8080'),
nil,
0
);
if hInternet <> nil then begin
// Set proxy authentication
InternetSetOption(hInternet, INTERNET_OPTION_PROXY_USERNAME,
PChar('username'), Length('username'));
InternetSetOption(hInternet, INTERNET_OPTION_PROXY_PASSWORD,
PChar('password'), Length('password'));
hConnect := InternetOpenUrl(hInternet,
'https://httpbin.org/ip', nil, 0,
INTERNET_FLAG_RELOAD, 0);
if hConnect <> nil then begin
InternetReadFile(hConnect, @Buffer, SizeOf(Buffer), BytesRead);
WriteLn(Copy(Buffer, 1, BytesRead));
InternetCloseHandle(hConnect);
end;
InternetCloseHandle(hInternet);
end;
end;
Using System Proxies
hInternet := InternetOpen(
'MyApp',
INTERNET_OPEN_TYPE_PRECONFIG, // use system settings
nil,
nil,
0
);
Proxy Rotation
type
TProxyInfo = record
Host: string;
Port: Integer;
Username: string;
Password: string;
end;
var
Proxies: array of TProxyInfo;
ProxyIndex: Integer = 0;
function GetNextProxy: TProxyInfo;
begin
Result := Proxies[ProxyIndex mod Length(Proxies)];
Inc(ProxyIndex);
end;
procedure FetchWithRotation(const URL: string);
var
HTTP: TIdHTTP;
Proxy: TProxyInfo;
begin
Proxy := GetNextProxy;
HTTP := TIdHTTP.Create(nil);
try
HTTP.ProxyParams.ProxyServer := Proxy.Host;
HTTP.ProxyParams.ProxyPort := Proxy.Port;
HTTP.ProxyParams.ProxyUsername := Proxy.Username;
HTTP.ProxyParams.ProxyPassword := Proxy.Password;
try
WriteLn(HTTP.Get(URL));
except
on E: Exception do
WriteLn('Error with proxy ', Proxy.Host, ': ', E.Message);
end;
finally
HTTP.Free;
end;
end;
Tips
- Indy is the standard choice for Delphi, shipped with the IDE
- Synapse is for Free Pascal and cross-platform projects
- WinINet is for Windows-only applications, using the system stack
- For SOCKS, use Indy TIdSocksInfo or Synapse SocksType
- OpenSSL DLL — don't forget to place libeay32.dll and ssleay32.dll next to your exe for HTTPS
Conclusion
Delphi/Pascal provide mature tools for working with proxies. Indy is the most comprehensive solution, supporting HTTP, SOCKS4, SOCKS5, and authentication. For simple tasks on Windows, the WinINet API is a quick option with no external dependencies.