Sample code for 30+ languages & platforms
Unicode C

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 Unicode C Downloads

Unicode C
#include <C_CkSocketW.h>
#include <C_CkRestW.h>
#include <C_CkAuthAwsW.h>
#include <C_CkXmlW.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkSocketW tunnel;
    const wchar_t *sshHostname;
    int sshPort;
    HCkRestW rest;
    BOOL bTls;
    int port;
    int maxWaitMs;
    HCkSocketW channel;
    HCkAuthAwsW authAws;
    const wchar_t *responseXml;
    HCkXmlW xml;

    success = FALSE;

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

    tunnel = CkSocketW_Create();

    sshHostname = L"sftp.example.com";
    sshPort = 22;

    // Connect to an SSH server and establish the SSH tunnel:
    success = CkSocketW_SshOpenTunnel(tunnel,sshHostname,sshPort);
    if (success == FALSE) {
        wprintf(L"%s\n",CkSocketW_lastErrorText(tunnel));
        CkSocketW_Dispose(tunnel);
        return;
    }

    // Authenticate with the SSH server via a login/password
    // or with a public key.
    // This example demonstrates SSH password authentication.
    success = CkSocketW_SshAuthenticatePw(tunnel,L"mySshLogin",L"mySshPassword");
    if (success == FALSE) {
        wprintf(L"%s\n",CkSocketW_lastErrorText(tunnel));
        CkSocketW_Dispose(tunnel);
        return;
    }

    //  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 = CkRestW_Create();

    bTls = TRUE;
    port = 443;
    maxWaitMs = 5000;

    // This returns a socket object that is a single channel within the SSH tunnel.
    channel = CkSocketW_Create();
    success = CkSocketW_SshNewChannel(tunnel,L"s3.amazonaws.com",port,bTls,maxWaitMs,channel);
    if (success == FALSE) {
        wprintf(L"%s\n",CkSocketW_lastErrorText(tunnel));
        CkSocketW_Dispose(tunnel);
        CkRestW_Dispose(rest);
        CkSocketW_Dispose(channel);
        return;
    }

    // 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 = CkRestW_UseConnection(rest,channel,TRUE);
    if (success != TRUE) {
        wprintf(L"%s\n",CkRestW_lastErrorText(rest));
        CkSocketW_Dispose(tunnel);
        CkRestW_Dispose(rest);
        CkSocketW_Dispose(channel);
        return;
    }

    // Provide AWS credentials for the REST call.
    authAws = CkAuthAwsW_Create();
    CkAuthAwsW_putAccessKey(authAws,L"AWS_ACCESS_KEY");
    CkAuthAwsW_putSecretKey(authAws,L"AWS_SECRET_KEY");
    CkAuthAwsW_putServiceName(authAws,L"s3");
    success = CkRestW_SetAuthAws(rest,authAws);

    // List all buckets for the account...
    responseXml = CkRestW_fullRequestNoBody(rest,L"GET",L"/");
    if (CkRestW_getLastMethodSuccess(rest) != TRUE) {
        wprintf(L"%s\n",CkRestW_lastErrorText(rest));
        CkSocketW_Dispose(tunnel);
        CkRestW_Dispose(rest);
        CkSocketW_Dispose(channel);
        CkAuthAwsW_Dispose(authAws);
        return;
    }

    xml = CkXmlW_Create();
    success = CkXmlW_LoadXml(xml,responseXml);

    // Show the full XML returned.
    wprintf(L"%s\n",CkXmlW_getXml(xml));

    // Iterate over the buckets, showing each bucket name.
    success = CkXmlW_FindChild2(xml,L"Buckets");
    if (CkXmlW_FirstChild2(xml) == TRUE) {
        wprintf(L"%s\n",CkXmlW_getChildContent(xml,L"Name"));
        while ((CkXmlW_NextSibling2(xml) == TRUE)) {
            wprintf(L"%s\n",CkXmlW_getChildContent(xml,L"Name"));
        }

    }

    // Move the internal pointer back to the root node.
    CkXmlW_GetRoot2(xml);


    CkSocketW_Dispose(tunnel);
    CkRestW_Dispose(rest);
    CkSocketW_Dispose(channel);
    CkAuthAwsW_Dispose(authAws);
    CkXmlW_Dispose(xml);

    }