Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added encoding logic #92

Merged
merged 12 commits into from
Apr 2, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
improve test case
ANKUR DWIVEDI authored and ANKUR DWIVEDI committed Feb 29, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 30cfe26cf656289bacfe208c428a4149f2858d5e
14 changes: 4 additions & 10 deletions libs/url/builder.ts
Original file line number Diff line number Diff line change
@@ -30,17 +30,11 @@ const hasMoreThanAscii = (str: string) => {
}

const customEncodeURIComponent = (str: string) => {
const parts = str.includes("?") ? str.split("?")[0] : str;
const segments = parts.split("/");
const encodedSegments = segments.map((segment) => {
if(segment.includes('https:') || segment.includes('http:') || segment.includes('tr:'))
return segment;
return encodeURIComponent(segment);
});
return str.includes("?") ? `${encodedSegments.join("/")}?${str.split("?")[1]}` : encodedSegments.join("/");
const url = new URL(str);
return url.toString();
};

const encodeStringIfRequired = (str: string) => {
export const encodeStringIfRequired = (str: string) => {
return hasMoreThanAscii(str) ? customEncodeURIComponent(str) : str;
}

@@ -180,7 +174,7 @@ function getSignatureTimestamp(seconds: number): string {
return String(currentTimestamp + sec);
}

function getSignature(opts: any) {
export function getSignature(opts: any) {
if (!opts.privateKey || !opts.url || !opts.urlEndpoint) return "";
var stringToSign = opts.url.replace(urlFormatter.addTrailingSlash(opts.urlEndpoint), "") + opts.expiryTimestamp;
return crypto.createHmac("sha1", opts.privateKey).update(stringToSign).digest("hex");
101 changes: 71 additions & 30 deletions tests/url-generation.js
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@ const pkg = require("../package.json");
const expect = chai.expect;
const initializationParams = require("./data").initializationParams
import ImageKit from "../index";
import { encodeStringIfRequired, getSignature } from "../libs/url/builder";
var imagekit = new ImageKit(initializationParams);

describe("URL generation", function () {
@@ -59,42 +60,82 @@ describe("URL generation", function () {
expect(url).includes(`ik-s=`);
});

it('Signed URL with é in filename', function () {
const url = imagekit.url({
path: "/test_é_path_alt.jpg",
signed: true,
});
expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_é_path_alt.jpg?ik-s=09a329f06a5106a8b9c43de8fb6a64948fff7c59`);
it("Signed URL with é in filename", function () {
const encodedUrl = encodeStringIfRequired("https://ik.imagekit.io/test_url_endpoint/test_é_path_alt.jpg");
expect(encodedUrl).equal("https://ik.imagekit.io/test_url_endpoint/test_%C3%A9_path_alt.jpg");
const signature = getSignature({
privateKey: "test_private_key",
url: encodedUrl,
urlEndpoint: "https://ik.imagekit.io/test_url_endpoint",
expiryTimestamp: "9999999999",
});
const url = imagekit.url({
path: "/test_é_path_alt.jpg",
signed: true,
});
expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/test_é_path_alt.jpg?ik-s=09a329f06a5106a8b9c43de8fb6a64948fff7c59`);
expect(url).includes(`ik-s=${signature}`);
});

it('Signed URL with é in filename and path', function () {
const url = imagekit.url({
path: "/aéb/test_é_path_alt.jpg",
signed: true,
});
expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/aéb/test_é_path_alt.jpg?ik-s=fca91582138ac65694425d52f0710b7ae2c3d7cf`);
it("Signed URL with é in filename and path", function () {
const encodedUrl = encodeStringIfRequired("https://ik.imagekit.io/test_url_endpoint/aéb/test_é_path_alt.jpg");
expect(encodedUrl).equal("https://ik.imagekit.io/test_url_endpoint/a%C3%A9b/test_%C3%A9_path_alt.jpg");
const signature = getSignature({
privateKey: "test_private_key",
url: encodedUrl,
urlEndpoint: "https://ik.imagekit.io/test_url_endpoint",
expiryTimestamp: "9999999999",
});
const url = imagekit.url({
path: "/aéb/test_é_path_alt.jpg",
signed: true,
});
expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/aéb/test_é_path_alt.jpg?ik-s=fca91582138ac65694425d52f0710b7ae2c3d7cf`);
expect(url).includes(`ik-s=${signature}`);
});

it('Signed URL with é in filename, path and transformation as path', function () {
const url = imagekit.url({
path: "/aéb/test_é_path_alt.jpg",
signed: true,
transformation: [ { raw: "l-text,i-Imagekité,fs-50,l-end"}],
transformationPosition: "path"
});
console.log({url})
expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-Imagekité,fs-50,l-end/aéb/test_é_path_alt.jpg?ik-s=38539311889a0721b46ebe30b5f297773d01d960`);
it("Signed URL with é in filename, path and transformation as path", function () {
const encodedUrl = encodeStringIfRequired("https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-Imagekité,fs-50,l-end/aéb/test_é_path_alt.jpg");
expect(encodedUrl).equal("https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-Imagekit%C3%A9,fs-50,l-end/a%C3%A9b/test_%C3%A9_path_alt.jpg");
const signature = getSignature({
privateKey: "test_private_key",
url: encodedUrl,
urlEndpoint: "https://ik.imagekit.io/test_url_endpoint",
expiryTimestamp: "9999999999",
});

const url = imagekit.url({
path: "/aéb/test_é_path_alt.jpg",
signed: true,
transformation: [{ raw: "l-text,i-Imagekité,fs-50,l-end" }],
transformationPosition: "path",
});
console.log({ url, signature });
expect(url).equal(
`https://ik.imagekit.io/test_url_endpoint/tr:l-text,i-Imagekité,fs-50,l-end/aéb/test_é_path_alt.jpg?ik-s=d7f5aec0b7a766556dfc280bdf2e3466877d025f`
);
expect(url).includes(`ik-s=${signature}`);
});

it('Signed URL with é in filename, path and transformation as query', function () {
const url = imagekit.url({
path: "/aéb/test_é_path_alt.jpg",
signed: true,
transformation: [ { raw: "l-text,i-Imagekité,fs-50,l-end"}],
transformationPosition: "query"
});
console.log({url})
expect(url).equal(`https://ik.imagekit.io/test_url_endpoint/aéb/test_é_path_alt.jpg?tr=l-text%2Ci-Imagekit%C3%A9%2Cfs-50%2Cl-end&ik-s=0b0107144b34e3b33264c0cec1d29ec98d46cbbb`);
it("Signed URL with é in filename, path and transformation as query", function () {
const encodedUrl = encodeStringIfRequired("https://ik.imagekit.io/test_url_endpoint/aéb/test_é_path_alt.jpg?tr=l-text%2Ci-Imagekité%2Cfs-50%2Cl-end");
expect(encodedUrl).equal("https://ik.imagekit.io/test_url_endpoint/a%C3%A9b/test_%C3%A9_path_alt.jpg?tr=l-text%2Ci-Imagekit%C3%A9%2Cfs-50%2Cl-end");
const signature = getSignature({
privateKey: "test_private_key",
url: encodedUrl,
urlEndpoint: "https://ik.imagekit.io/test_url_endpoint",
expiryTimestamp: "9999999999",
});
const url = imagekit.url({
path: "/aéb/test_é_path_alt.jpg",
signed: true,
transformation: [{ raw: "l-text,i-Imagekité,fs-50,l-end" }],
transformationPosition: "query",
});
expect(url).equal(
`https://ik.imagekit.io/test_url_endpoint/aéb/test_é_path_alt.jpg?tr=l-text%2Ci-Imagekit%C3%A9%2Cfs-50%2Cl-end&ik-s=0b0107144b34e3b33264c0cec1d29ec98d46cbbb`
);
expect(url).includes(`ik-s=${signature}`);
});