DelphiFAQ Home Search:
General :: Programming :: Delphi :: Network
Network (local network and Internet) programming under Windows with Delphi.

Articles:

This list is sorted by recent document popularity (not total page views).
New documents will first appear at the bottom.

Featured Article

Detect an HTTP proxy

If you write a core http client, e.g. from socket level, you may need to detect whether there is an http proxy used. This includes the name of the proxy server and the port number it operates on.
Such proxy servers are often used where a firewall is installed.

Luckily IE is installed on many Windows systems, and IE puts this information in the registry under

\Software\Microsoft\Windows\CurrentVersion\Internet Settings

The following procedure GetProxy retrieves the host name, port number and whether the proxy is enabled. You can use it as shown in the FormCreate() event handler.

Note:
The value ProxyEnable should be a DWord, but sometimes it may be stored as binary or as a string, depending on the version of IE that the user has installed. The code below evaluates the type and reads it appropriately.

Edit:
The declaration for the constant sProxyEnable was missing. Thanks to S. Neigaard for pointing this out.

unit fProxy;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics,
   Controls, Forms, Dialogs, Registry;
 
 type
   TForm1 = class(TForm)
     procedure FormCreate(Sender: TObject);
   private
     { private declarations }
   public
     { public declarations }
   end;
 
 var
   Form1: TForm1;
 
 implementation
 
 {$R *.DFM}
 
 function GetProxy(var Host : string;
                   var Port : integer; 
                   var ProxyEnabled : boolean) : boolean;
 const
   sProxyEnable = 'ProxyEnable';
 var
   s : string;
   p : integer;
 begin
   with TRegistry.Create do
   begin
     RootKey := HKEY_CURRENT_USER;
     ProxyEnabled := false;
     s := '';
     OpenKey ('\Software\Microsoft\Windows\CurrentVersion\Internet Settings',
              True);
     if ValueExists('ProxyServer') then
       s := ReadString('ProxyServer');
 
     if s <> '' then
     begin
       p := pos(':', s);
       if p=0 then
         p := length(s)+1;
       Host := copy(s, 1, p-1);
       try
         Port := StrToInt(copy (s,p+1,999));
       except
         Port := 80;
       end;
 
       ProxyEnabled := true;
     end;
 
     if ValueExists('ProxyEnable') then
     begin
         case GetDataType(sProxyEnable) of
         rdString,
         rdExpandString:
         begin
           sPortTmp := AnsiLowerCase(ReadString(sProxyEnable));
           ProxyEnabled := true;
           if pos(' '+sPortTmp+' ', ' yes true t enabled 1 ') > 0 then
             ProxyEnabled := true
           else
           if pos(' '+sPortTmp+' ', ' no false f none disabled 0 ') > 0 then
             ProxyEnabled := false
         end;
         rdInteger:
         begin
           ProxyEnabled := ReadBool(sProxyEnable);
         end;
         rdBinary:
         begin
           ProxyEnabled := true;
           ReadBinaryData(sProxyEnable, ProxyEnabled, 1);
         end;
         end;
     end;
 
     Free;
   end;
 
   Result := s<>'';
 end;
 
 procedure TForm1.FormCreate(Sender: TObject);
 var
   Host : string;
   Port : integer;
   ProxyEnabled : boolean;
 const
   YesNo : array [false..true] of string = (' not ', '');
 begin
   // get proxy information
   if GetProxy(Host, Port, ProxyEnabled) then
     ShowMessage(Format('Your proxy is %s on port %d, it is%s enabled.',
                 [Host, Port, YesNo[ProxyEnabled]]))
   else
     ShowMessage('No proxy detected');
 end;
 
 end.
You don't like the formatting? Check out SourceCoder then!
Generated 0:01:11 on Nov 15, 2019