PureBasic
PureBasic
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 PureBasic Downloads
IncludeFile "CkSocket.pb"
IncludeFile "CkXml.pb"
IncludeFile "CkRest.pb"
IncludeFile "CkAuthAws.pb"
Procedure ChilkatExample()
success.i = 0
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
tunnel.i = CkSocket::ckCreate()
If tunnel.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
sshHostname.s = "sftp.example.com"
sshPort.i = 22
; Connect to an SSH server and establish the SSH tunnel:
success = CkSocket::ckSshOpenTunnel(tunnel,sshHostname,sshPort)
If success = 0
Debug CkSocket::ckLastErrorText(tunnel)
CkSocket::ckDispose(tunnel)
ProcedureReturn
EndIf
; Authenticate with the SSH server via a login/password
; or with a public key.
; This example demonstrates SSH password authentication.
success = CkSocket::ckSshAuthenticatePw(tunnel,"mySshLogin","mySshPassword")
If success = 0
Debug CkSocket::ckLastErrorText(tunnel)
CkSocket::ckDispose(tunnel)
ProcedureReturn
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.
rest.i = CkRest::ckCreate()
If rest.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
bTls.i = 1
port.i = 443
maxWaitMs.i = 5000
; This returns a socket object that is a single channel within the SSH tunnel.
channel.i = CkSocket::ckCreate()
If channel.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkSocket::ckSshNewChannel(tunnel,"s3.amazonaws.com",port,bTls,maxWaitMs,channel)
If success = 0
Debug CkSocket::ckLastErrorText(tunnel)
CkSocket::ckDispose(tunnel)
CkRest::ckDispose(rest)
CkSocket::ckDispose(channel)
ProcedureReturn
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.)
success = CkRest::ckUseConnection(rest,channel,1)
If success <> 1
Debug CkRest::ckLastErrorText(rest)
CkSocket::ckDispose(tunnel)
CkRest::ckDispose(rest)
CkSocket::ckDispose(channel)
ProcedureReturn
EndIf
; Provide AWS credentials for the REST call.
authAws.i = CkAuthAws::ckCreate()
If authAws.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkAuthAws::setCkAccessKey(authAws, "AWS_ACCESS_KEY")
CkAuthAws::setCkSecretKey(authAws, "AWS_SECRET_KEY")
CkAuthAws::setCkServiceName(authAws, "s3")
success = CkRest::ckSetAuthAws(rest,authAws)
; List all buckets for the account...
responseXml.s = CkRest::ckFullRequestNoBody(rest,"GET","/")
If CkRest::ckLastMethodSuccess(rest) <> 1
Debug CkRest::ckLastErrorText(rest)
CkSocket::ckDispose(tunnel)
CkRest::ckDispose(rest)
CkSocket::ckDispose(channel)
CkAuthAws::ckDispose(authAws)
ProcedureReturn
EndIf
xml.i = CkXml::ckCreate()
If xml.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkXml::ckLoadXml(xml,responseXml)
; Show the full XML returned.
Debug CkXml::ckGetXml(xml)
; Iterate over the buckets, showing each bucket name.
success = CkXml::ckFindChild2(xml,"Buckets")
If CkXml::ckFirstChild2(xml) = 1
Debug CkXml::ckGetChildContent(xml,"Name")
While (CkXml::ckNextSibling2(xml) = 1)
Debug CkXml::ckGetChildContent(xml,"Name")
Wend
EndIf
; Move the internal pointer back to the root node.
CkXml::ckGetRoot2(xml)
CkSocket::ckDispose(tunnel)
CkRest::ckDispose(rest)
CkSocket::ckDispose(channel)
CkAuthAws::ckDispose(authAws)
CkXml::ckDispose(xml)
ProcedureReturn
EndProcedure