Skip to content

Commit 96ced73

Browse files
authored
fix: case-insensitive headers (#66)
1 parent 0d7f338 commit 96ced73

File tree

4 files changed

+106
-15
lines changed

4 files changed

+106
-15
lines changed

lambda-function.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
module.exports = lambdaFunction;
22

3+
const lowercaseKeys = require("lowercase-keys");
4+
35
async function lambdaFunction(probot, event, context) {
46
try {
57
// Ends function immediately after callback
68
context.callbackWaitsForEmptyEventLoop = false;
79

10+
// lowercase all headers to respect headers insensitivity (RFC 7230 $3.2 'Header Fields', see issue #62)
11+
const headersLowerCase = lowercaseKeys(event.headers);
12+
813
// this will be simpler once we ship `verifyAndParse()`
914
// see https://github.com/octokit/webhooks.js/issues/379
1015
await probot.webhooks.verifyAndReceive({
11-
id:
12-
event.headers["X-GitHub-Delivery"] ||
13-
event.headers["x-github-delivery"],
14-
name: event.headers["X-GitHub-Event"] || event.headers["x-github-event"],
16+
id: headersLowerCase["x-github-delivery"],
17+
name: headersLowerCase["x-github-event"],
1518
signature:
16-
event.headers["X-Hub-Signature-256"] ||
17-
event.headers["x-hub-signature-256"] ||
18-
event.headers["X-Hub-Signature"] ||
19-
event.headers["x-hub-signature"],
19+
headersLowerCase["x-hub-signature-256"] ||
20+
headersLowerCase["x-hub-signature"],
2021
payload: JSON.parse(event.body),
2122
});
2223

package-lock.json

+18-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"repository": "https://github.com/probot/adapter-aws-lambda-serverless",
1515
"dependencies": {
1616
"@probot/get-private-key": "^1.1.0",
17-
"probot": "^11.0.6"
17+
"probot": "^11.0.6",
18+
"lowercase-keys": "^2.0.0"
1819
},
1920
"devDependencies": {
2021
"@types/jest": "^26.0.20",

test/index.test.js

+77-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const nock = require("nock");
2+
const path = require("path");
23

34
const { createLambdaFunction, Probot, ProbotOctokit } = require("../index");
45
const app = require("./fixtures/app");
@@ -28,7 +29,7 @@ describe("@probot/adapter-aws-lambda-serverless", () => {
2829
"/repos/probot/adapter-adapter-aws-lambda-serverless/commits/headcommitsha123/comments",
2930
(requestBody) => {
3031
expect(requestBody).toStrictEqual({
31-
body: "Hello from test/fixtures/app.js",
32+
body: `Hello from test${path.sep}fixtures${path.sep}app.js`,
3233
});
3334

3435
return true;
@@ -65,7 +66,7 @@ describe("@probot/adapter-aws-lambda-serverless", () => {
6566
"/repos/probot/adapter-adapter-aws-lambda-serverless/commits/headcommitsha123/comments",
6667
(requestBody) => {
6768
expect(requestBody).toStrictEqual({
68-
body: "Hello from test/fixtures/app.js",
69+
body: `Hello from test${path.sep}fixtures${path.sep}app.js`,
6970
});
7071

7172
return true;
@@ -93,4 +94,78 @@ describe("@probot/adapter-aws-lambda-serverless", () => {
9394

9495
expect(mock.activeMocks()).toStrictEqual([]);
9596
});
97+
98+
test("GitHub request headers", async () => {
99+
const fn = createLambdaFunction(app, { probot });
100+
101+
const mock = nock("https://api.github.com")
102+
.post(
103+
"/repos/probot/adapter-adapter-aws-lambda-serverless/commits/headcommitsha123/comments",
104+
(requestBody) => {
105+
expect(requestBody).toStrictEqual({
106+
body: `Hello from test${path.sep}fixtures${path.sep}app.js`,
107+
});
108+
109+
return true;
110+
}
111+
)
112+
.reply(201, {});
113+
114+
const context = {};
115+
const payload = JSON.stringify(require("./fixtures/push.json"));
116+
const signature = probot.webhooks.sign(payload);
117+
const event = {
118+
headers: {
119+
"X-Github-Delivery": "eventid123",
120+
"X-Github-Event": "push",
121+
"X-Hub-Signature": signature,
122+
},
123+
body: payload,
124+
};
125+
126+
await fn(event, context);
127+
128+
expect(context).toStrictEqual({
129+
callbackWaitsForEmptyEventLoop: false,
130+
});
131+
132+
expect(mock.activeMocks()).toStrictEqual([]);
133+
});
134+
135+
test("camelcase request headers (#62)", async () => {
136+
const fn = createLambdaFunction(app, { probot });
137+
138+
const mock = nock("https://api.github.com")
139+
.post(
140+
"/repos/probot/adapter-adapter-aws-lambda-serverless/commits/headcommitsha123/comments",
141+
(requestBody) => {
142+
expect(requestBody).toStrictEqual({
143+
body: `Hello from test${path.sep}fixtures${path.sep}app.js`,
144+
});
145+
146+
return true;
147+
}
148+
)
149+
.reply(201, {});
150+
151+
const context = {};
152+
const payload = JSON.stringify(require("./fixtures/push.json"));
153+
const signature = probot.webhooks.sign(payload);
154+
const event = {
155+
headers: {
156+
"X-Github-Delivery": "EventId123",
157+
"X-Github-Event": "push",
158+
"X-Hub-Signature": signature,
159+
},
160+
body: payload,
161+
};
162+
163+
await fn(event, context);
164+
165+
expect(context).toStrictEqual({
166+
callbackWaitsForEmptyEventLoop: false,
167+
});
168+
169+
expect(mock.activeMocks()).toStrictEqual([]);
170+
});
96171
});

0 commit comments

Comments
 (0)