diff --git a/src/runtime/cache.ts b/src/runtime/cache.ts index 878ffd48cb..91fca5857e 100644 --- a/src/runtime/cache.ts +++ b/src/runtime/cache.ts @@ -129,13 +129,15 @@ export interface ResponseCacheEntry { } export interface CachedEventHandlerOptions - extends Omit< - CacheOptions>, - "getKey" | "transform" | "validate" - > { + extends Omit>, "transform" | "validate"> { + getKey?: (event: H3Event) => string; headersOnly?: boolean; } +function escapeKey(key: string) { + return key.replace(/[^\dA-Za-z]/g, ""); +} + export function defineCachedEventHandler( handler: EventHandler, opts: CachedEventHandlerOptions = defaultCacheOptions @@ -143,10 +145,15 @@ export function defineCachedEventHandler( const _opts: CacheOptions> = { ...opts, getKey: (event) => { + const key = opts.getKey?.(event); + if (key) { + return escapeKey(key); + } const url = event.req.originalUrl || event.req.url; - const friendlyName = decodeURI(parseURL(url).pathname) - .replace(/[^\dA-Za-z]/g, "") - .slice(0, 16); + const friendlyName = escapeKey(decodeURI(parseURL(url).pathname)).slice( + 0, + 16 + ); const urlHash = hash(url); return `${friendlyName}.${urlHash}`; },