Sample code for 30+ languages & platforms
Delphi DLL

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 Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Http, StringBuilder, Url, CkDateTime;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
mySecurityKey: PWideChar;
url: PWideChar;
urlObj: HCkUrl;
url_scheme: PWideChar;
url_host: PWideChar;
url_path: PWideChar;
expTime: HCkDateTime;
expires: PWideChar;
sbToHash: HCkStringBuilder;
token: PWideChar;
sbSignedUrl: HCkStringBuilder;
signedUrl: PWideChar;
http: HCkHttp;

begin
success := False;

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

mySecurityKey := 'e7ea8d73-8fa0-44ef-a2cc-91526f7df5ed';

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

// Extract the URL components.
urlObj := CkUrl_Create();
CkUrl_ParseUrl(urlObj,url);

url_scheme := 'https';
if (CkUrl_getSsl(urlObj) = False) then
  begin
    url_scheme := 'http';
  end;

url_host := CkUrl__host(urlObj);
url_path := CkUrl__path(urlObj);

// Calculate an expiration time 1 hour from the current date/time.
expTime := CkDateTime_Create();
CkDateTime_SetFromCurrentSystemTime(expTime);
CkDateTime_AddSeconds(expTime,3600);
expires := CkDateTime__getAsUnixTimeStr(expTime,False);

Memo1.Lines.Add('Expires = ' + expires);

// Create the string to hash
sbToHash := CkStringBuilder_Create();
CkStringBuilder_Append(sbToHash,mySecurityKey);
CkStringBuilder_Append(sbToHash,url_path);
CkStringBuilder_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 := CkStringBuilder__getHash(sbToHash,'sha256','base64Url','utf-8');

sbSignedUrl := CkStringBuilder_Create();
CkStringBuilder_Append(sbSignedUrl,url_scheme);
CkStringBuilder_Append(sbSignedUrl,'://');
CkStringBuilder_Append(sbSignedUrl,url_host);
CkStringBuilder_Append(sbSignedUrl,url_path);
CkStringBuilder_Append(sbSignedUrl,'?token=');
CkStringBuilder_Append(sbSignedUrl,token);
CkStringBuilder_Append(sbSignedUrl,'&expires=');
CkStringBuilder_Append(sbSignedUrl,expires);

signedUrl := CkStringBuilder__getAsString(sbSignedUrl);
Memo1.Lines.Add('Signed URL: ' + signedUrl);

// Use the signed URL to download the file.
http := CkHttp_Create();
success := CkHttp_Download(http,signedUrl,'c:/aaworkarea/sample.pdf');
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
  end
else
  begin
    Memo1.Lines.Add('Success.');
  end;

CkUrl_Dispose(urlObj);
CkDateTime_Dispose(expTime);
CkStringBuilder_Dispose(sbToHash);
CkStringBuilder_Dispose(sbSignedUrl);
CkHttp_Dispose(http);

end;