Sample code for 30+ languages & platforms
Lianja Requires Chilkat v11.0.0+

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 Lianja Downloads

Lianja
llSuccess = .F.

//  This example requires the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

loTunnel = createobject("CkSocket")

lcSshHostname = "sftp.example.com"
lnSshPort = 22

//  Connect to an SSH server and establish the SSH tunnel:
llSuccess = loTunnel.SshOpenTunnel(lcSshHostname,lnSshPort)
if (llSuccess = .F.) then
    ? loTunnel.LastErrorText
    release loTunnel
    return
endif

//  Authenticate with the SSH server via a login/password
//  or with a public key.
//  This example demonstrates SSH password authentication.
llSuccess = loTunnel.SshAuthenticatePw("mySshLogin","mySshPassword")
if (llSuccess = .F.) then
    ? loTunnel.LastErrorText
    release loTunnel
    return
endif

//   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.
loRest = createobject("CkRest")

llBTls = .T.
lnPort = 443
lnMaxWaitMs = 5000

//  This returns a socket object that is a single channel within the SSH tunnel.
loChannel = createobject("CkSocket")
llSuccess = loTunnel.SshNewChannel("s3.amazonaws.com",lnPort,llBTls,lnMaxWaitMs,loChannel)
if (llSuccess = .F.) then
    ? loTunnel.LastErrorText
    release loTunnel
    release loRest
    release loChannel
    return
endif

//  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.)
llSuccess = loRest.UseConnection(loChannel,.T.)
if (llSuccess <> .T.) then
    ? loRest.LastErrorText
    release loTunnel
    release loRest
    release loChannel
    return
endif

//  Provide AWS credentials for the REST call.
loAuthAws = createobject("CkAuthAws")
loAuthAws.AccessKey = "AWS_ACCESS_KEY"
loAuthAws.SecretKey = "AWS_SECRET_KEY"
loAuthAws.ServiceName = "s3"
llSuccess = loRest.SetAuthAws(loAuthAws)

//  List all buckets for the account...
lcResponseXml = loRest.FullRequestNoBody("GET","/")
if (loRest.LastMethodSuccess <> .T.) then
    ? loRest.LastErrorText
    release loTunnel
    release loRest
    release loChannel
    release loAuthAws
    return
endif

loXml = createobject("CkXml")
llSuccess = loXml.LoadXml(lcResponseXml)

//  Show the full XML returned.
? loXml.GetXml()

//  Iterate over the buckets, showing each bucket name.
llSuccess = loXml.FindChild2("Buckets")
if (loXml.FirstChild2() = .T.) then
    ? loXml.GetChildContent("Name")
    do while (loXml.NextSibling2() = .T.)
        ? loXml.GetChildContent("Name")
    enddo
endif

//  Move the internal pointer back to the root node.
loXml.GetRoot2()


release loTunnel
release loRest
release loChannel
release loAuthAws
release loXml