Skip to content

Commit bffd2a9

Browse files
authored
Stricter handling of /cdn-cgi/handler/ routes. (#10673)
* Scope trigger handlers middleware to /cdn-cgi/handler/ rather than /cdn-cgi/ * Send 404 response for unimplemented /cdn-cgi/handler/ routes * Add changesets * Add additional test to ensure non-handler /cdn-cgi/ routes are not blocked
1 parent 835d6f7 commit bffd2a9

File tree

5 files changed

+77
-13
lines changed

5 files changed

+77
-13
lines changed

.changeset/hungry-pants-talk.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"miniflare": patch
3+
---
4+
5+
Send a 404 response for unimplemented `/cdn-cgi/handler/` routes.

.changeset/social-foxes-crash.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cloudflare/vite-plugin": patch
3+
---
4+
5+
Only forward `/cdn-cgi/handler/` routes to trigger handlers.

packages/miniflare/src/workers/core/entry.worker.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,13 @@ export default <ExportedHandler<Env>>{
430430
ctx
431431
);
432432
}
433+
434+
if (url.pathname.startsWith("/cdn-cgi/handler/")) {
435+
return new Response(
436+
`"${url.pathname}" is not a valid handler. Did you mean to use "/cdn-cgi/handler/scheduled" or "/cdn-cgi/handler/email"?`,
437+
{ status: 404 }
438+
);
439+
}
433440
}
434441

435442
let response = await service.fetch(request);

packages/miniflare/test/index.spec.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,47 @@ This is a random email body.
17361736
t.is(await res.text(), "true");
17371737
});
17381738

1739+
test("Miniflare: unimplemented /cdn-cgi/handler/ routes", async (t) => {
1740+
const mf = new Miniflare({
1741+
modules: true,
1742+
script: `
1743+
export default {
1744+
fetch() {
1745+
return new Response("Hello world");
1746+
}
1747+
}
1748+
`,
1749+
unsafeTriggerHandlers: true,
1750+
});
1751+
t.teardown(() => mf.dispose());
1752+
1753+
const res = await mf.dispatchFetch("http://localhost/cdn-cgi/handler/foo");
1754+
t.is(
1755+
await res.text(),
1756+
`"/cdn-cgi/handler/foo" is not a valid handler. Did you mean to use "/cdn-cgi/handler/scheduled" or "/cdn-cgi/handler/email"?`
1757+
);
1758+
t.is(res.status, 404);
1759+
});
1760+
1761+
test("Miniflare: other /cdn-cgi/ routes", async (t) => {
1762+
const mf = new Miniflare({
1763+
modules: true,
1764+
script: `
1765+
export default {
1766+
fetch() {
1767+
return new Response("Hello world");
1768+
}
1769+
}
1770+
`,
1771+
unsafeTriggerHandlers: true,
1772+
});
1773+
t.teardown(() => mf.dispose());
1774+
1775+
const res = await mf.dispatchFetch("http://localhost/cdn-cgi/foo");
1776+
t.is(await res.text(), "Hello world");
1777+
t.is(res.status, 200);
1778+
});
1779+
17391780
test("Miniflare: listens on ipv6", async (t) => {
17401781
const log = new TestLog(t);
17411782

packages/vite-plugin-cloudflare/src/index.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -595,19 +595,25 @@ export function cloudflare(pluginConfig: PluginConfig = {}): vite.Plugin[] {
595595
const entryWorkerName = entryWorkerConfig.name;
596596

597597
// cron && email triggers
598-
viteDevServer.middlewares.use("/cdn-cgi/", (req, res, next) => {
599-
const requestHandler = createRequestHandler((request) => {
600-
assert(miniflare, `Miniflare not defined`);
601-
602-
// set the target service that handles these requests
603-
// to point to the User Worker (see `getTargetService` fn in
604-
// `packages/miniflare/src/workers/core/entry.worker.ts`)
605-
request.headers.set(CoreHeaders.ROUTE_OVERRIDE, entryWorkerName);
606-
return miniflare.dispatchFetch(request, { redirect: "manual" });
607-
});
608-
609-
requestHandler(req, res, next);
610-
});
598+
viteDevServer.middlewares.use(
599+
"/cdn-cgi/handler/",
600+
(req, res, next) => {
601+
const requestHandler = createRequestHandler((request) => {
602+
assert(miniflare, `Miniflare not defined`);
603+
604+
// set the target service that handles these requests
605+
// to point to the User Worker (see `getTargetService` fn in
606+
// `packages/miniflare/src/workers/core/entry.worker.ts`)
607+
request.headers.set(
608+
CoreHeaders.ROUTE_OVERRIDE,
609+
entryWorkerName
610+
);
611+
return miniflare.dispatchFetch(request, { redirect: "manual" });
612+
});
613+
614+
requestHandler(req, res, next);
615+
}
616+
);
611617
}
612618
},
613619
},

0 commit comments

Comments
 (0)