Skip to content

Commit 07edfd4

Browse files
committed
separate out cookie handling more explicitly
1 parent 092d545 commit 07edfd4

File tree

1 file changed

+27
-29
lines changed

1 file changed

+27
-29
lines changed

packages/kit/src/runtime/server/index.js

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ export async function respond(request, options, state) {
118118
/** @type {import('types').ResponseHeaders} */
119119
const headers = {};
120120

121+
/** @type {string[]} */
122+
const cookies = [];
123+
121124
/** @type {import('types').RequestEvent} */
122125
const event = {
123126
get clientAddress() {
@@ -141,31 +144,26 @@ export async function respond(request, options, state) {
141144
setHeaders: (new_headers) => {
142145
for (const key in new_headers) {
143146
const lower = key.toLowerCase();
147+
const value = new_headers[key];
144148

145-
if (lower in headers) {
146-
if (lower === 'set-cookie') {
147-
if (!Array.isArray(headers[lower])) {
148-
headers[lower] = [/** @type{string} */ (headers[lower])];
149-
}
150-
const cookies = /** @type{string[]} */ (headers[lower]);
151-
const new_cookies = /** @type{string[]} */ (
152-
Array.isArray(new_headers[key]) ? new_headers[key] : [new_headers[key]]
153-
);
154-
for (const new_cookie of new_cookies) {
155-
if (cookies.includes(new_cookie)) {
156-
throw new Error(`"${key}" header already has cookie with same value`);
157-
}
158-
cookies.push(new_cookie);
149+
if (lower === 'set-cookie') {
150+
const new_cookies = /** @type {string[]} */ (Array.isArray(value) ? value : [value]);
151+
152+
for (const cookie of new_cookies) {
153+
if (cookies.includes(cookie)) {
154+
throw new Error(`"${key}" header already has cookie with same value`);
159155
}
160-
} else {
161-
throw new Error(`"${key}" header is already set`);
156+
157+
cookies.push(cookie);
162158
}
159+
} else if (lower in headers) {
160+
throw new Error(`"${key}" header is already set`);
163161
} else {
164-
headers[lower] = new_headers[key];
165-
}
162+
headers[lower] = value;
166163

167-
if (state.prerendering && lower === 'cache-control') {
168-
state.prerendering.cache = /** @type {string} */ (new_headers[key]);
164+
if (state.prerendering && lower === 'cache-control') {
165+
state.prerendering.cache = /** @type {string} */ (value);
166+
}
169167
}
170168
}
171169
},
@@ -327,19 +325,19 @@ export async function respond(request, options, state) {
327325
: await render_page(event, route, options, state, resolve_opts);
328326
}
329327

330-
for (const key in headers) {
331-
const value = headers[key];
332-
if (key === 'set-cookie') {
333-
for (const cookie of Array.isArray(value) ? value : [value]) {
334-
response.headers.append(key, /** @type {string} */ (cookie));
335-
}
336-
} else if (!is_data_request) {
337-
// we only want to set cookies on __data.json requests, we don't
338-
// want to cache stuff erroneously etc
328+
if (!is_data_request) {
329+
// we only want to set cookies on __data.json requests, we don't
330+
// want to cache stuff erroneously etc
331+
for (const key in headers) {
332+
const value = headers[key];
339333
response.headers.set(key, /** @type {string} */ (value));
340334
}
341335
}
342336

337+
for (const cookie of cookies) {
338+
response.headers.append('set-cookie', cookie);
339+
}
340+
343341
// respond with 304 if etag matches
344342
if (response.status === 200 && response.headers.has('etag')) {
345343
let if_none_match_value = request.headers.get('if-none-match');

0 commit comments

Comments
 (0)