Sample code for 30+ languages & platforms
Unicode C

Bunny Sign URL and then Download using Signed URL

See more Bunny CDN Examples

Shows how to sign a URL for BunnyCDN Token Authentication and then use it to download.

Chilkat Unicode C Downloads

Unicode C
#include <C_CkUrlW.h>
#include <C_CkDateTimeW.h>
#include <C_CkStringBuilderW.h>
#include <C_CkHttpW.h>

void ChilkatSample(void)
    {
    BOOL success;
    const wchar_t *mySecurityKey;
    const wchar_t *url;
    HCkUrlW urlObj;
    const wchar_t *url_scheme;
    const wchar_t *url_host;
    const wchar_t *url_path;
    HCkDateTimeW expTime;
    const wchar_t *expires;
    HCkStringBuilderW sbToHash;
    const wchar_t *token;
    HCkStringBuilderW sbSignedUrl;
    const wchar_t *signedUrl;
    HCkHttpW http;

    success = FALSE;

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

    mySecurityKey = L"e7ea8d73-8fa0-44ef-a2cc-91526f7df5ed";

    url = L"https://test.b-cdn.net/sample-pdf-with-images.pdf";

    // Extract the URL components.
    urlObj = CkUrlW_Create();
    CkUrlW_ParseUrl(urlObj,url);

    url_scheme = L"https";
    if (CkUrlW_getSsl(urlObj) == FALSE) {
        url_scheme = L"http";
    }

    url_host = CkUrlW_host(urlObj);
    url_path = CkUrlW_path(urlObj);

    // Calculate an expiration time 1 hour from the current date/time.
    expTime = CkDateTimeW_Create();
    CkDateTimeW_SetFromCurrentSystemTime(expTime);
    CkDateTimeW_AddSeconds(expTime,3600);
    expires = CkDateTimeW_getAsUnixTimeStr(expTime,FALSE);

    wprintf(L"Expires = %s\n",expires);

    // Create the string to hash
    sbToHash = CkStringBuilderW_Create();
    CkStringBuilderW_Append(sbToHash,mySecurityKey);
    CkStringBuilderW_Append(sbToHash,url_path);
    CkStringBuilderW_Append(sbToHash,expires);

    // Base64Url encoding is the same as base64, except "-" is used instead of "+",
    // "_" is used instead of "/", and no "=" padding is added.
    token = CkStringBuilderW_getHash(sbToHash,L"sha256",L"base64Url",L"utf-8");

    sbSignedUrl = CkStringBuilderW_Create();
    CkStringBuilderW_Append(sbSignedUrl,url_scheme);
    CkStringBuilderW_Append(sbSignedUrl,L"://");
    CkStringBuilderW_Append(sbSignedUrl,url_host);
    CkStringBuilderW_Append(sbSignedUrl,url_path);
    CkStringBuilderW_Append(sbSignedUrl,L"?token=");
    CkStringBuilderW_Append(sbSignedUrl,token);
    CkStringBuilderW_Append(sbSignedUrl,L"&expires=");
    CkStringBuilderW_Append(sbSignedUrl,expires);

    signedUrl = CkStringBuilderW_getAsString(sbSignedUrl);
    wprintf(L"Signed URL: %s\n",signedUrl);

    // Use the signed URL to download the file.
    http = CkHttpW_Create();
    success = CkHttpW_Download(http,signedUrl,L"c:/aaworkarea/sample.pdf");
    if (success == FALSE) {
        wprintf(L"%s\n",CkHttpW_lastErrorText(http));
    }
    else {
        wprintf(L"Success.\n");
    }



    CkUrlW_Dispose(urlObj);
    CkDateTimeW_Dispose(expTime);
    CkStringBuilderW_Dispose(sbToHash);
    CkStringBuilderW_Dispose(sbSignedUrl);
    CkHttpW_Dispose(http);

    }