Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
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 Pascal (Lazarus/Delphi) Downloads
program ChilkatDemo;
// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
SysUtils,
CkDllLoader,
Chilkat.Http,
Chilkat.StringBuilder,
Chilkat.Url,
Chilkat.CkDateTime;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
mySecurityKey: string;
url: string;
urlObj: TUrl;
url_scheme: string;
url_host: string;
url_path: string;
expTime: TCkDateTime;
expires: string;
sbToHash: TStringBuilder;
token: string;
sbSignedUrl: TStringBuilder;
signedUrl: string;
http: THttp;
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 := TUrl.Create;
urlObj.ParseUrl(url);
url_scheme := 'https';
if (urlObj.Ssl = False) then
begin
url_scheme := 'http';
end;
url_host := urlObj.Host;
url_path := urlObj.Path;
// Calculate an expiration time 1 hour from the current date/time.
expTime := TCkDateTime.Create;
expTime.SetFromCurrentSystemTime();
expTime.AddSeconds(3600);
expires := expTime.GetAsUnixTimeStr(False);
WriteLn('Expires = ' + expires);
// Create the string to hash
sbToHash := TStringBuilder.Create;
sbToHash.Append(mySecurityKey);
sbToHash.Append(url_path);
sbToHash.Append(expires);
// Base64Url encoding is the same as base64, except "-" is used instead of "+",
// "_" is used instead of "/", and no "=" padding is added.
token := sbToHash.GetHash('sha256','base64Url','utf-8');
sbSignedUrl := TStringBuilder.Create;
sbSignedUrl.Append(url_scheme);
sbSignedUrl.Append('://');
sbSignedUrl.Append(url_host);
sbSignedUrl.Append(url_path);
sbSignedUrl.Append('?token=');
sbSignedUrl.Append(token);
sbSignedUrl.Append('&expires=');
sbSignedUrl.Append(expires);
signedUrl := sbSignedUrl.GetAsString();
WriteLn('Signed URL: ' + signedUrl);
// Use the signed URL to download the file.
http := THttp.Create;
success := http.Download(signedUrl,'c:/aaworkarea/sample.pdf');
if (success = False) then
begin
WriteLn(http.LastErrorText);
end
else
begin
WriteLn('Success.');
end;
urlObj.Free;
expTime.Free;
sbToHash.Free;
sbSignedUrl.Free;
http.Free;
end;
// ---------------------------------------------------------------------------
begin
try
RunDemo;
except
on E: Exception do
WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
end;
WriteLn;
{$IFDEF MSWINDOWS}
WriteLn('Press Enter to exit...');
ReadLn;
{$ENDIF}
end.