From 604061bc9f0316997c3498a1e563e971d6f3995d Mon Sep 17 00:00:00 2001 From: Ame_x Edam Date: Wed, 12 Feb 2025 02:32:00 +0000 Subject: [PATCH 1/5] fix(etag): remove parts that may cause unintended behavior --- src/middleware/etag/digest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/etag/digest.ts b/src/middleware/etag/digest.ts index 336590b8c..8c6b6f971 100644 --- a/src/middleware/etag/digest.ts +++ b/src/middleware/etag/digest.ts @@ -12,7 +12,7 @@ export const generateDigest = async ( stream: ReadableStream | null, generator: (body: Uint8Array) => ArrayBuffer | Promise ): Promise => { - if (!stream || !crypto || !crypto.subtle) { + if (!stream) { return null } From 0a078f6e23f21199a535c1822000f2bb434ec121 Mon Sep 17 00:00:00 2001 From: Ame_x Edam Date: Wed, 12 Feb 2025 02:36:56 +0000 Subject: [PATCH 2/5] 2 --- src/middleware/etag/index.ts | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/middleware/etag/index.ts b/src/middleware/etag/index.ts index b8fb4ecaf..67721698e 100644 --- a/src/middleware/etag/index.ts +++ b/src/middleware/etag/index.ts @@ -57,15 +57,21 @@ function etagMatches(etag: string, ifNoneMatch: string | null) { export const etag = (options?: ETagOptions): MiddlewareHandler => { const retainedHeaders = options?.retainedHeaders ?? RETAINED_304_HEADERS const weak = options?.weak ?? false - const generator = - options?.generateDigest ?? - ((body: Uint8Array) => - crypto.subtle.digest( - { - name: 'SHA-1', - }, - body - )) + let generator = options?.generateDigest + + if (!generator) { + if (crypto && crypto.subtle) { + generator = (body: Uint8Array) => + crypto.subtle.digest( + { + name: 'SHA-1', + }, + body + ) + } else { + throw new Error('`crypto.subtle` is undefined. Etag middleware requires it.') + } + } return async function etag(c, next) { const ifNoneMatch = c.req.header('If-None-Match') ?? null @@ -76,7 +82,7 @@ export const etag = (options?: ETagOptions): MiddlewareHandler => { let etag = res.headers.get('ETag') if (!etag) { - const hash = await generateDigest(res.clone().body, generator) + const hash = await generateDigest(res.clone().body, generator!) if (hash === null) { return } From 87382fae0fed40d80122570d77e68187ced523d6 Mon Sep 17 00:00:00 2001 From: Ame_x Edam Date: Wed, 12 Feb 2025 02:41:09 +0000 Subject: [PATCH 3/5] fix --- src/middleware/etag/digest.ts | 4 ++-- src/middleware/etag/index.ts | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/middleware/etag/digest.ts b/src/middleware/etag/digest.ts index 8c6b6f971..833cd0c7b 100644 --- a/src/middleware/etag/digest.ts +++ b/src/middleware/etag/digest.ts @@ -10,9 +10,9 @@ const mergeBuffers = (buffer1: ArrayBuffer | undefined, buffer2: Uint8Array): Ui export const generateDigest = async ( stream: ReadableStream | null, - generator: (body: Uint8Array) => ArrayBuffer | Promise + generator?: (body: Uint8Array) => ArrayBuffer | Promise ): Promise => { - if (!stream) { + if (!stream || !generator) { return null } diff --git a/src/middleware/etag/index.ts b/src/middleware/etag/index.ts index 67721698e..009c038a9 100644 --- a/src/middleware/etag/index.ts +++ b/src/middleware/etag/index.ts @@ -68,8 +68,6 @@ export const etag = (options?: ETagOptions): MiddlewareHandler => { }, body ) - } else { - throw new Error('`crypto.subtle` is undefined. Etag middleware requires it.') } } @@ -82,7 +80,7 @@ export const etag = (options?: ETagOptions): MiddlewareHandler => { let etag = res.headers.get('ETag') if (!etag) { - const hash = await generateDigest(res.clone().body, generator!) + const hash = await generateDigest(res.clone().body, generator) if (hash === null) { return } From 62c5fa4990dd8cb7cda4a7436add485d96d0ee52 Mon Sep 17 00:00:00 2001 From: Ame_x Edam Date: Thu, 13 Feb 2025 02:28:15 +0000 Subject: [PATCH 4/5] refactor --- src/middleware/etag/digest.ts | 4 ++-- src/middleware/etag/index.ts | 34 +++++++++++++++++++++------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/middleware/etag/digest.ts b/src/middleware/etag/digest.ts index 833cd0c7b..8c6b6f971 100644 --- a/src/middleware/etag/digest.ts +++ b/src/middleware/etag/digest.ts @@ -10,9 +10,9 @@ const mergeBuffers = (buffer1: ArrayBuffer | undefined, buffer2: Uint8Array): Ui export const generateDigest = async ( stream: ReadableStream | null, - generator?: (body: Uint8Array) => ArrayBuffer | Promise + generator: (body: Uint8Array) => ArrayBuffer | Promise ): Promise => { - if (!stream || !generator) { + if (!stream) { return null } diff --git a/src/middleware/etag/index.ts b/src/middleware/etag/index.ts index 009c038a9..c233d611c 100644 --- a/src/middleware/etag/index.ts +++ b/src/middleware/etag/index.ts @@ -31,6 +31,24 @@ function etagMatches(etag: string, ifNoneMatch: string | null) { return ifNoneMatch != null && ifNoneMatch.split(/,\s*/).indexOf(etag) > -1 } +function initializeGenerator( + generator?: ETagOptions['generateDigest'] +): ETagOptions['generateDigest'] | undefined { + if (!generator) { + if (crypto && crypto.subtle) { + generator = (body: Uint8Array) => + crypto.subtle.digest( + { + name: 'SHA-1', + }, + body + ) + } + } + + return generator +} + /** * ETag Middleware for Hono. * @@ -57,19 +75,7 @@ function etagMatches(etag: string, ifNoneMatch: string | null) { export const etag = (options?: ETagOptions): MiddlewareHandler => { const retainedHeaders = options?.retainedHeaders ?? RETAINED_304_HEADERS const weak = options?.weak ?? false - let generator = options?.generateDigest - - if (!generator) { - if (crypto && crypto.subtle) { - generator = (body: Uint8Array) => - crypto.subtle.digest( - { - name: 'SHA-1', - }, - body - ) - } - } + const generator = initializeGenerator(options?.generateDigest) return async function etag(c, next) { const ifNoneMatch = c.req.header('If-None-Match') ?? null @@ -80,6 +86,8 @@ export const etag = (options?: ETagOptions): MiddlewareHandler => { let etag = res.headers.get('ETag') if (!etag) { + if (!generator) return + const hash = await generateDigest(res.clone().body, generator) if (hash === null) { return From 2cd257309e466ce393b721f530800f85e5e86711 Mon Sep 17 00:00:00 2001 From: Ame_x Edam Date: Thu, 13 Feb 2025 02:30:05 +0000 Subject: [PATCH 5/5] chore: lint --- src/middleware/etag/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/middleware/etag/index.ts b/src/middleware/etag/index.ts index c233d611c..663b25613 100644 --- a/src/middleware/etag/index.ts +++ b/src/middleware/etag/index.ts @@ -86,8 +86,9 @@ export const etag = (options?: ETagOptions): MiddlewareHandler => { let etag = res.headers.get('ETag') if (!etag) { - if (!generator) return - + if (!generator) { + return + } const hash = await generateDigest(res.clone().body, generator) if (hash === null) { return