Skip to content

Commit 927ae51

Browse files
committed
fix(middleware-recursion-detection): handle case insensitive matching of X-Amzn-Trace-Id header
1 parent 80ef7ab commit 927ae51

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

packages/middleware-recursion-detection/src/index.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,27 @@ describe(recursionDetectionMiddleware.name, () => {
7070
expect(request.headers[TRACE_ID_HEADER_NAME]).toBe("some-real-trace-id");
7171
});
7272

73+
it(`should NOT set ${TRACE_ID_HEADER_NAME} header when the header is already set in all lowercase`, async () => {
74+
process.env = {
75+
AWS_LAMBDA_FUNCTION_NAME: "some-function",
76+
_X_AMZN_TRACE_ID: "some-trace-id",
77+
};
78+
const handler = recursionDetectionMiddleware({ runtime: "node" })(mockNextHandler, {} as any);
79+
await handler({
80+
input: {},
81+
request: new HttpRequest({
82+
headers: {
83+
[TRACE_ID_HEADER_NAME.toLowerCase()]: "some-real-trace-id",
84+
},
85+
}),
86+
});
87+
88+
const { calls } = (mockNextHandler as any).mock;
89+
expect(calls.length).toBe(1);
90+
const { request } = mockNextHandler.mock.calls[0][0];
91+
expect(request.headers[TRACE_ID_HEADER_NAME.toLowerCase()]).toBe("some-real-trace-id");
92+
});
93+
7394
it("has no effect for browser runtime", async () => {
7495
process.env = {
7596
AWS_LAMBDA_FUNCTION_NAME: "some-function",

packages/middleware-recursion-detection/src/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ export const recursionDetectionMiddleware =
2727
<Output extends MetadataBearer>(next: BuildHandler<any, Output>): BuildHandler<any, Output> =>
2828
async (args: BuildHandlerArguments<any>): Promise<BuildHandlerOutput<Output>> => {
2929
const { request } = args;
30-
if (
31-
!HttpRequest.isInstance(request) ||
32-
options.runtime !== "node" ||
33-
request.headers.hasOwnProperty(TRACE_ID_HEADER_NAME)
34-
) {
30+
if (!HttpRequest.isInstance(request) || options.runtime !== "node") {
3531
return next(args);
3632
}
33+
const traceIdHeader =
34+
Object.keys(request.headers ?? {}).find((h) => h.toLowerCase() === TRACE_ID_HEADER_NAME.toLowerCase()) ??
35+
TRACE_ID_HEADER_NAME;
3736

37+
if (request.headers.hasOwnProperty(traceIdHeader)) {
38+
return next(args);
39+
}
3840
const functionName = process.env[ENV_LAMBDA_FUNCTION_NAME];
3941
const traceId = process.env[ENV_TRACE_ID];
4042
const nonEmptyString = (str: unknown): str is string => typeof str === "string" && str.length > 0;

0 commit comments

Comments
 (0)