Skip to content

Commit 3e17498

Browse files
author
User
committed
fix(line): accept HEAD webhook probes (#25721)
1 parent 9ef0fc2 commit 3e17498

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/line/webhook-node.test.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ describe("createLineNodeWebhookHandler", () => {
6969
expect(res.body).toBe("OK");
7070
});
7171

72+
it("returns 204 for HEAD", async () => {
73+
const bot = { handleWebhook: vi.fn(async () => {}) };
74+
const runtime = { log: vi.fn(), error: vi.fn(), exit: vi.fn() };
75+
const handler = createLineNodeWebhookHandler({
76+
channelSecret: "secret",
77+
bot,
78+
runtime,
79+
readBody: async () => "",
80+
});
81+
82+
const { res } = createRes();
83+
await handler({ method: "HEAD", headers: {} } as unknown as IncomingMessage, res);
84+
85+
expect(res.statusCode).toBe(204);
86+
expect(res.body).toBeUndefined();
87+
});
88+
7289
it("returns 200 for verification request (empty events, no signature)", async () => {
7390
const rawBody = JSON.stringify({ events: [] });
7491
const { bot, handler } = createPostWebhookTestHarness(rawBody);
@@ -82,14 +99,14 @@ describe("createLineNodeWebhookHandler", () => {
8299
expect(bot.handleWebhook).not.toHaveBeenCalled();
83100
});
84101

85-
it("returns 405 for non-GET/non-POST methods", async () => {
102+
it("returns 405 for non-GET/HEAD/POST methods", async () => {
86103
const { bot, handler } = createPostWebhookTestHarness(JSON.stringify({ events: [] }));
87104

88105
const { res, headers } = createRes();
89106
await handler({ method: "PUT", headers: {} } as unknown as IncomingMessage, res);
90107

91108
expect(res.statusCode).toBe(405);
92-
expect(headers.allow).toBe("GET, POST");
109+
expect(headers.allow).toBe("GET, HEAD, POST");
93110
expect(bot.handleWebhook).not.toHaveBeenCalled();
94111
});
95112

src/line/webhook-node.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ export function createLineNodeWebhookHandler(params: {
3636
const readBody = params.readBody ?? readLineWebhookRequestBody;
3737

3838
return async (req: IncomingMessage, res: ServerResponse) => {
39-
// Handle GET requests for webhook verification
40-
if (req.method === "GET") {
39+
// Some webhook validators and health probes use GET/HEAD.
40+
if (req.method === "GET" || req.method === "HEAD") {
41+
if (req.method === "HEAD") {
42+
res.statusCode = 204;
43+
res.end();
44+
return;
45+
}
4146
res.statusCode = 200;
4247
res.setHeader("Content-Type", "text/plain");
4348
res.end("OK");
@@ -47,7 +52,7 @@ export function createLineNodeWebhookHandler(params: {
4752
// Only accept POST requests
4853
if (req.method !== "POST") {
4954
res.statusCode = 405;
50-
res.setHeader("Allow", "GET, POST");
55+
res.setHeader("Allow", "GET, HEAD, POST");
5156
res.setHeader("Content-Type", "application/json");
5257
res.end(JSON.stringify({ error: "Method Not Allowed" }));
5358
return;

0 commit comments

Comments
 (0)