diff --git a/.changeset/shy-avocados-sip.md b/.changeset/shy-avocados-sip.md new file mode 100644 index 000000000000..20b3566767e7 --- /dev/null +++ b/.changeset/shy-avocados-sip.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correct allow header methods list for 405s diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 5fb1c6b4a86e..e9c9e3354e1d 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -34,13 +34,11 @@ export function method_not_allowed(mod, method) { /** @param {Partial>} mod */ export function allowed_methods(mod) { - const allowed = []; + const allowed = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'].filter( + (method) => method in mod + ); - for (const method in ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']) { - if (method in mod) allowed.push(method); - } - - if (mod.GET || mod.HEAD) allowed.push('HEAD'); + if ('GET' in mod || 'HEAD' in mod) allowed.push('HEAD'); return allowed; } diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index ce31f520f98c..7baf3686d819 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -124,7 +124,10 @@ test.describe('Endpoints', () => { const response = await request.post('/endpoint-output/body'); expect(response.status()).toBe(405); - expect(response.headers()['allow'].includes('GET')); + + const allow_header = response.headers()['allow']; + expect(allow_header).toMatch(/\bGET\b/); + expect(allow_header).toMatch(/\bHEAD\b/); }); // TODO all the remaining tests in this section are really only testing