Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
REST through SSH Tunnel
See more REST Examples
Demonstrates how to connect through an SSH Tunnel (via port-forwarding) to make REST API calls.Chilkat Pascal (Lazarus/Delphi) Downloads
program ChilkatDemo;
// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
SysUtils,
CkDllLoader,
Chilkat.AuthAws,
Chilkat.Rest,
Chilkat.Xml,
Chilkat.Socket;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
tunnel: TSocket;
sshHostname: string;
sshPort: Integer;
rest: TRest;
bTls: Boolean;
port: Integer;
maxWaitMs: Integer;
channel: TSocket;
authAws: TAuthAws;
responseXml: string;
xml: TXml;
begin
success := False;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
tunnel := TSocket.Create;
sshHostname := 'sftp.example.com';
sshPort := 22;
// Connect to an SSH server and establish the SSH tunnel:
success := tunnel.SshOpenTunnel(sshHostname,sshPort);
if (success = False) then
begin
WriteLn(tunnel.LastErrorText);
Exit;
end;
// Authenticate with the SSH server via a login/password
// or with a public key.
// This example demonstrates SSH password authentication.
success := tunnel.SshAuthenticatePw('mySshLogin','mySshPassword');
if (success = False) then
begin
WriteLn(tunnel.LastErrorText);
Exit;
end;
// OK, the SSH tunnel is setup. Now open a channel within the tunnel.
// (Any number of channels may be created from the same SSH tunnel.
// Multiple channels may coexist at the same time.)
// This example connects to a REST server through the SSH tunnel.
// It will connect to the Amazon AWS service for this example.
rest := TRest.Create;
bTls := True;
port := 443;
maxWaitMs := 5000;
// This returns a socket object that is a single channel within the SSH tunnel.
channel := TSocket.Create;
success := tunnel.SshNewChannel('s3.amazonaws.com',port,bTls,maxWaitMs,channel);
if (success = False) then
begin
WriteLn(tunnel.LastErrorText);
Exit;
end;
// Use the connection. (This connection is a TLS running on an SSH channel through an SSH tunnel.
// In other words, TLS is wrapped within the SSH tunnel.)
success := rest.UseConnection(channel,True);
if (success <> True) then
begin
WriteLn(rest.LastErrorText);
Exit;
end;
// Provide AWS credentials for the REST call.
authAws := TAuthAws.Create;
authAws.AccessKey := 'AWS_ACCESS_KEY';
authAws.SecretKey := 'AWS_SECRET_KEY';
authAws.ServiceName := 's3';
success := rest.SetAuthAws(authAws);
// List all buckets for the account...
responseXml := rest.FullRequestNoBody('GET','/');
if (rest.LastMethodSuccess <> True) then
begin
WriteLn(rest.LastErrorText);
Exit;
end;
xml := TXml.Create;
success := xml.LoadXml(responseXml);
// Show the full XML returned.
WriteLn(xml.GetXml());
// Iterate over the buckets, showing each bucket name.
success := xml.FindChild2('Buckets');
if (xml.FirstChild2() = True) then
begin
WriteLn(xml.GetChildContent('Name'));
while (xml.NextSibling2() = True) do
begin
WriteLn(xml.GetChildContent('Name'));
end;
end;
// Move the internal pointer back to the root node.
xml.GetRoot2();
tunnel.Free;
rest.Free;
channel.Free;
authAws.Free;
xml.Free;
end;
// ---------------------------------------------------------------------------
begin
try
RunDemo;
except
on E: Exception do
WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
end;
WriteLn;
{$IFDEF MSWINDOWS}
WriteLn('Press Enter to exit...');
ReadLn;
{$ENDIF}
end.