Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
5 changes: 5 additions & 0 deletions .changeset/quick-cookies-guarded.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: error when reading non-serialized `set-cookie` headers via `getSetCookie` in `load`
15 changes: 15 additions & 0 deletions packages/kit/src/runtime/server/page/load_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,21 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)

return value;
};

const get_set_cookie = response.headers.getSetCookie;
response.headers.getSetCookie = () => {
const values = get_set_cookie.call(response.headers);
for (const value of values) {
const included = resolve_opts.filterSerializedResponseHeaders('set-cookie', value);
if (!included) {
throw new Error(
`Failed to get response header "set-cookie" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#handle (at ${event.route.id})`
);
}
}

return values;
};
}

return proxy;
Expand Down
12 changes: 12 additions & 0 deletions packages/kit/src/runtime/server/page/load_data.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,15 @@ test('errors when trying to access non-serialized request headers on the server'
/Failed to get response header "content-type" — it must be included by the `filterSerializedResponseHeaders` option/
);
});

test('errors when trying to access non-serialized set-cookie headers on the server', async () => {
const fetch = create_fetch({
// eslint-disable-next-line @typescript-eslint/require-await
fetch: async () => new Response('foo', { headers: { 'set-cookie': 'a=1' } })
});
const response = await fetch('https://domain-a.com');
assert.throws(
() => response.headers.getSetCookie(),
/Failed to get response header "set-cookie" — it must be included by the `filterSerializedResponseHeaders` option/
);
});
Loading