Delphi Internet Development with ICS
Introduction
Along with Indy 
and Synapse, ICS 
('Internet Component Suite") is one of the most use open-source set of Internet components. It supports HTTP, 
SMTP, ICMP, etc. Support is available through the ICS 
mailing list.
Setup
Removing a previous version
    - Component > Install Packages : Remove "Overbyte ICS for 
    Delphi 7"
- From "C:\Program Files\Borland\Delphi7\Projects\Bpl\", delete 
    OverbyteIcsDel70.bpl and OverbyteIcsDel70.dcp
- Tools > Environment Options > Library > Library Path: Remove 
    path to previous version of ICS
- File > Close All
Note: "If you are reinstalling, or installing a new version, be sure 
to delete all dcu, and obj files from vc32 and internet directories. This applies 
to all Win32 versions. When installing a new version, always delete old dcu, 
obj, dcpil and always recompile everything ! Close everything before recompiling 
the library or packages.When installing a new version, be sure to unzip it in 
the same directory tree as the old one or you'll mess both versions."
Fresh install
    - Unzip the ICS package
- Launch Delphi, File > Close all
- Open Delphi\Vc32\OverbyteIcsDel70.dpk (OverbyteIcsDel100Package.dpk 
    is for D2006), Compile, Install, File > Close All
- Tools > Environment Options > Library > Library Path: Add path 
    to Delphi\Vc32\ where DCU were just compiled
A new FPiette tab is displayed. Some samples are available in Delphi\Internet\ 
.
Connecting to a socket and TXing/RXing data
Uploading a file with FTP
    - FtpClient1.UserName:='mylogin';
    - FtpClient1.PassWord:='test';
    - FtpClient1.HostName:='ftp.acme.com';
    - FtpClient1.Passive := True;
    - FtpClient1.LocalFileName:='.\myfile.txt';
    - FtpClient1.HostDirName:='/';
    - FtpClient1.HostFileName := FtpClient1.LocalFileName;
    - try
    -     FtpClient1.Connect;
    -     FTPClient1.Binary := True;
    -     FtpClient1.Put;
    -     FtpClient1.Quit;
    - except
    -     ShowMessage('Error uploading to FTP');
    - end;
Using FTP to upload all the files from a given directory
ICS comes with an FTP client component. There's also a big sample Internet\OverbyteIcsFtpTst1.pas.
Here's how to use the FTPClient component to list all the files in a given 
local directory, and upload them all to an FTP server (Note: doesn't recurse 
into sub-directories):
    - procedure TForm1.Button2Click(Sender: TObject);
    - var
    -   MyFiles : TStringList;
    -   Path : String;
    -   SR: TSearchRec;
    -   I : Integer;
    - begin
    -   ListBox1.Clear;
    -   If Length(LabeledEdit1.Text) = 0 then begin
    -     ShowMessage('Choose source directory');
    -     Exit;
    -   end;
    -  
    -   MyFiles := TStringList.Create;
    -   try
    -     Path := LabeledEdit1.Text;
    -     if FindFirst(Path + '*.*', faAnyFile, SR) = 
    0 then begin
    -       repeat
    -         if (SR.Attr <> 
    faDirectory) then begin
    -           MyFiles.Add(SR.Name);
    -         end;
    -       until FindNext(SR) <> 0;
    -       FindClose(SR);
    -     end;
    -  
    -     Button2.Enabled := False;
    -     //Connect to FTP in BIN + PASSIVE
    -     FtpClient1.UserName:='joe';
    -     FtpClient1.PassWord:='mypass';
    -     FtpClient1.HostName:='ftp.acme.com';
    -     //Must exist!
    -     FtpClient1.HostDirName:= LabeledEdit2.Text;
    -     FtpClient1.Binary := True;
    -     FtpClient1.Passive := True;
    -  
    -     FtpClient1.Connect;
    -     try
    -       FtpClient1.Cwd;
    -       try
    -         //Upload each file
    -         for I := 0 to MyFiles.Count-1 
    do begin
    -           FtpClient1.LocalFileName:=LabeledEdit1.Text 
    + MyFiles[i];
    -           FtpClient1.HostFileName:=MyFiles[i];
    -  
    -           ListBox1.Items.Add('Upload 
    ' + MyFiles[i]);
    -           PostMessage(Listbox1.Handle, 
    wm_vscroll, SB_LINEDOWN, 0);
    -  
    -           FtpClient1.Put;
    -         end;
    -       except
    -         ShowMessage ('Error 
    uploading files');
    -       end;
    -       FtpClient1.Quit;
    -     except
    -       ShowMessage ('Error connecting to 
    FTP');
    -     end;
    -  
    -     Button2.Enabled := True;
    -  
    -   finally
    -     MyFiles.Free;
    -   end;
    -  
    - end;
Downloading a web page and displaying its HTML source
- procedure TForm1.Button1Click(Sender: TObject);
    - begin
    -   With HttpCli1 do begin
    -     URL            := 
    'www.google.com';
    -     RequestVer     := '1.1';
    -     RcvdStream := TMemoryStream.Create;
    -     try
    -         Get;
    -     except
    -         ShowMessage('GET Failed 
    !');-         RcvdStream.Free;
    -         Exit;
    -     end;
    -  
    
    -     RcvdStream.Seek(0,0);
    -     Memo1.Lines.LoadFromStream(RcvdStream);
    -     RcvdStream.Free;
    -   end;
    -  
    - end;
Authenticating with POST + cookie
 
Downloading a web page through a local proxy
First, create a new application, and add an HttpCli component from the FPiette 
tab. Next, add a label and a push button, and paste the following code:
    - implementation
    -  
    - const
    -   MyURL = 'http://www.acme.com';
    -   MyPROXY = 'localhost';
    -   MyPORT = '50000';
    -  
    - {$R *.dfm}
    -  
    - procedure TForm1.Button1Click(Sender: TObject);
    - var
    -   I : Integer;
    -   Response : String;
    - begin
    -   With HttpCli1 do begin
    -     URL            := 
    MyURL;
    -     Proxy          := 
    MyPROXY;
    -     ProxyPort      := MyPORT;
    -     RequestVer     := '1.1';
    -     RcvdStream := TMemoryStream.Create;
    -     try
    -         Get;
    -     except-         Response := 'GET Failed 
    !' + #13#10;
    -         Response := Response 
    + 'StatusCode   = ' + IntToStr(HttpCli1.StatusCode) + #13#10;
    -         Response := Response 
    + 'ReasonPhrase = ' + HttpCli1.ReasonPhrase;
    -         ShowMessage(Response);
    -         RcvdStream.Free;
    -         Exit;
    -     end;
    -  
    -     Response := 'StatusCode = ' + IntToStr(StatusCode);
    -     for I := 0 to RcvdHeader.Count - 1 do begin
    -       Response := Response + RcvdHeader.Strings[I] 
    + #13#10;
    -     end;
    -     Label1.Caption := Response;
    -  
    
    -     RcvdStream.Seek(0,0);
    -     Memo1.Lines.LoadFromStream(RcvdStream);
    -     RcvdStream.Free;
    -   end;
    -  
    - end;
Resources