Skip to content

Commit 01e0846

Browse files
authored
[quick-edit] Partitioned cookies (#5016)
1 parent 88be4b8 commit 01e0846

File tree

9 files changed

+82
-24
lines changed

9 files changed

+82
-24
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,8 @@
6868
},
6969
"[html]": {
7070
"editor.defaultFormatter": "esbenp.prettier-vscode"
71+
},
72+
"[typescript]": {
73+
"editor.defaultFormatter": "esbenp.prettier-vscode"
7174
}
7275
}

fixtures/worker-app/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
"type:tests": "tsc -p ./tests/tsconfig.json"
1414
},
1515
"devDependencies": {
16-
"wrangler": "workspace:*",
1716
"@cloudflare/workers-tsconfig": "workspace:^",
18-
"undici": "^5.28.3"
17+
"undici": "^5.28.3",
18+
"wrangler": "workspace:*"
1919
},
2020
"dependencies": {
21+
"cookie": "^0.6.0",
2122
"isomorphic-random-example": "workspace:^"
2223
}
2324
}

fixtures/worker-app/src/index.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import cookie from "cookie";
12
import { randomBytes } from "isomorphic-random-example";
23
import { now } from "./dep";
34
import { logErrors } from "./log";
@@ -15,10 +16,29 @@ export default {
1516
async fetch(request) {
1617
console.log("request log");
1718

18-
const { pathname, origin } = new URL(request.url);
19+
const { pathname, origin, hostname, host } = new URL(request.url);
1920
if (pathname === "/random") return new Response(hexEncode(randomBytes(8)));
2021
if (pathname === "/error") throw new Error("Oops!");
2122
if (pathname === "/redirect") return Response.redirect(`${origin}/foo`);
23+
if (pathname === "/cookie")
24+
return new Response("", {
25+
headers: [
26+
[
27+
"Set-Cookie",
28+
cookie.serialize("hello", "world", {
29+
domain: hostname,
30+
}),
31+
],
32+
[
33+
"Set-Cookie",
34+
cookie.serialize("hello2", "world2", {
35+
domain: host,
36+
secure: true,
37+
}),
38+
],
39+
],
40+
});
41+
2242
if (request.headers.get("X-Test-URL") !== null) {
2343
return new Response(request.url);
2444
}

fixtures/worker-app/tests/index.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,15 @@ describe("'wrangler dev' correctly renders pages", () => {
139139
`http://${ip}:${port}/foo`
140140
);
141141
});
142+
143+
it("rewrites set-cookie headers to the hostname, not host", async ({
144+
expect,
145+
}) => {
146+
const response = await fetch(`http://${ip}:${port}/cookie`);
147+
148+
expect(response.headers.getSetCookie()).toStrictEqual([
149+
`hello=world; Domain=${ip}`,
150+
`hello2=world2; Domain=${ip}; Secure`,
151+
]);
152+
});
142153
});

packages/edge-preview-authenticated-proxy/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
"devDependencies": {
1414
"@cloudflare/eslint-config-worker": "*",
1515
"@cloudflare/workers-types": "^4.20230321.0",
16-
"cookie": "^0.5.0",
16+
"@types/cookie": "^0.6.0",
17+
"cookie": "^0.6.0",
1718
"promjs": "^0.4.2",
1819
"toucan-js": "^3.1.0",
19-
"wrangler": "workspace:*",
20-
"@types/cookie": "^0.5.1"
20+
"wrangler": "workspace:*"
2121
}
2222
}

packages/edge-preview-authenticated-proxy/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ async function updatePreviewToken(url: URL, env: Env, ctx: ExecutionContext) {
297297
sameSite: "none",
298298
httpOnly: true,
299299
domain: url.hostname,
300+
partitioned: true,
300301
}),
301302
},
302303
});

packages/edge-preview-authenticated-proxy/tests/index.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ compatibility_date = "2023-01-01"
142142
expect(
143143
removeUUID(resp.headers.get("set-cookie") ?? "")
144144
).toMatchInlineSnapshot(
145-
'"token=00000000-0000-0000-0000-000000000000; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None"'
145+
'"token=00000000-0000-0000-0000-000000000000; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None"'
146146
);
147147
tokenId = (resp.headers.get("set-cookie") ?? "")
148148
.split(";")[0]
@@ -152,7 +152,7 @@ compatibility_date = "2023-01-01"
152152
{
153153
method: "GET",
154154
headers: {
155-
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None`,
155+
cookie: `token=${tokenId}`,
156156
},
157157
}
158158
);
@@ -183,7 +183,7 @@ compatibility_date = "2023-01-01"
183183
expect(
184184
removeUUID(resp.headers.get("set-cookie") ?? "")
185185
).toMatchInlineSnapshot(
186-
'"token=00000000-0000-0000-0000-000000000000; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None"'
186+
'"token=00000000-0000-0000-0000-000000000000; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None"'
187187
);
188188
tokenId = (resp.headers.get("set-cookie") ?? "")
189189
.split(";")[0]
@@ -218,7 +218,7 @@ compatibility_date = "2023-01-01"
218218
{
219219
method: "GET",
220220
headers: {
221-
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None`,
221+
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None`,
222222
},
223223
}
224224
);
@@ -237,7 +237,7 @@ compatibility_date = "2023-01-01"
237237
{
238238
method: "GET",
239239
headers: {
240-
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None`,
240+
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None`,
241241
},
242242
redirect: "manual",
243243
}
@@ -255,7 +255,7 @@ compatibility_date = "2023-01-01"
255255
{
256256
method: "PUT",
257257
headers: {
258-
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None`,
258+
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None`,
259259
},
260260
redirect: "manual",
261261
}
@@ -270,7 +270,7 @@ compatibility_date = "2023-01-01"
270270
method: "PUT",
271271
headers: {
272272
"X-Custom-Header": "custom",
273-
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None`,
273+
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None`,
274274
},
275275
redirect: "manual",
276276
}
@@ -284,7 +284,7 @@ compatibility_date = "2023-01-01"
284284
{
285285
method: "PUT",
286286
headers: {
287-
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; SameSite=None`,
287+
cookie: `token=${tokenId}; Domain=random-data.preview.devprod.cloudflare.dev; HttpOnly; Secure; Partitioned; SameSite=None`,
288288
},
289289
redirect: "manual",
290290
}

packages/wrangler/templates/startDevWorker/ProxyWorker.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,8 @@ function insertLiveReloadScript(
304304
* so that this proxy is transparent to the Client Browser and User Worker.
305305
*/
306306
function rewriteUrlRelatedHeaders(headers: Headers, from: URL, to: URL) {
307+
const setCookie = headers.getAll("Set-Cookie");
308+
headers.delete("Set-Cookie");
307309
headers.forEach((value, key) => {
308310
if (typeof value === "string" && value.includes(from.host)) {
309311
headers.set(
@@ -312,4 +314,13 @@ function rewriteUrlRelatedHeaders(headers: Headers, from: URL, to: URL) {
312314
);
313315
}
314316
});
317+
for (const cookie of setCookie) {
318+
headers.append(
319+
"Set-Cookie",
320+
cookie.replace(
321+
new RegExp(`Domain=${from.hostname}($|;|,)`),
322+
`Domain=${to.hostname}$1`
323+
)
324+
);
325+
}
315326
}

pnpm-lock.yaml

Lines changed: 21 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)