Skip to content

Commit d4829f7

Browse files
authored
fix: don't respond to OPTIONS requests for non-oauth requests (#539)
1 parent 55bd05c commit d4829f7

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

src/middleware/handle-request.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ export async function handleRequest(
1212
{ pathPrefix = "/api/github/oauth" }: HandlerOptions,
1313
request: OctokitRequest,
1414
): Promise<OctokitResponse | undefined> {
15+
// request.url may include ?query parameters which we don't want for `route`
16+
// hence the workaround using new URL()
17+
let { pathname } = new URL(request.url as string, "http://localhost");
18+
if (!pathname.startsWith(`${pathPrefix}/`)) {
19+
return undefined;
20+
}
21+
1522
if (request.method === "OPTIONS") {
1623
return {
1724
status: 200,
@@ -24,12 +31,6 @@ export async function handleRequest(
2431
};
2532
}
2633

27-
// request.url may include ?query parameters which we don't want for `route`
28-
// hence the workaround using new URL()
29-
let { pathname } = new URL(request.url as string, "http://localhost");
30-
if (!pathname.startsWith(`${pathPrefix}/`)) {
31-
return undefined;
32-
}
3334
pathname = pathname.slice(pathPrefix.length + 1);
3435

3536
const route = [request.method, pathname].join(" ");

test/node-middleware.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,45 @@ describe("createNodeMiddleware(app)", () => {
2727
server.close();
2828

2929
expect(response.status).toEqual(200);
30+
expect(response.headers.get("access-control-allow-origin")).toEqual("*");
31+
expect(response.headers.get("access-control-allow-methods")).toEqual("*");
32+
expect(response.headers.get("access-control-allow-headers")).toEqual(
33+
"Content-Type, User-Agent, Authorization",
34+
);
35+
});
36+
37+
it("doesn't overwrite pre-flight requests unrelated to github oauth", async () => {
38+
const app = new OAuthApp({
39+
clientId: "0123",
40+
clientSecret: "0123secret",
41+
});
42+
43+
const server = createServer((req, res) => {
44+
if (req.url === "/health") {
45+
res.writeHead(200, {
46+
"Content-Type": "text/plain",
47+
"Access-Control-Allow-Origin": "http://localhost:8080",
48+
});
49+
res.end("OK");
50+
return;
51+
}
52+
createNodeMiddleware(app);
53+
}).listen();
54+
// @ts-expect-error complains about { port } although it's included in returned AddressInfo interface
55+
const { port } = server.address();
56+
57+
const response = await fetch(`http://localhost:${port}/health`, {
58+
method: "OPTIONS",
59+
});
60+
61+
server.close();
62+
63+
expect(response.status).toEqual(200);
64+
expect(response.headers.get("access-control-allow-origin")).toEqual(
65+
"http://localhost:8080",
66+
);
67+
expect(response.headers.get("access-control-allow-methods")).toEqual(null);
68+
expect(response.headers.get("access-control-allow-headers")).toEqual(null);
3069
});
3170

3271
it("GET /api/github/oauth/login", async () => {

0 commit comments

Comments
 (0)