From de8938eb8b17912ac03836b86fbab652d2f17a57 Mon Sep 17 00:00:00 2001 From: Lew Gordon Date: Mon, 11 Jul 2022 10:17:22 -0400 Subject: [PATCH] fix(getCanonicalHeaders): ignores undefined header values It seems like there are certain edge cases that cause header values to become undefined. In these scenarios we'll hit an exception. --- .../src/getCanonicalHeaders.spec.ts | 19 +++++++++++++++++++ .../signature-v4/src/getCanonicalHeaders.ts | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/packages/signature-v4/src/getCanonicalHeaders.spec.ts b/packages/signature-v4/src/getCanonicalHeaders.spec.ts index 7eaf540518ad..360950b3085d 100644 --- a/packages/signature-v4/src/getCanonicalHeaders.spec.ts +++ b/packages/signature-v4/src/getCanonicalHeaders.spec.ts @@ -1,4 +1,5 @@ import { HttpRequest } from "@aws-sdk/protocol-http"; +import { HeaderBag } from "@aws-sdk/types"; import { ALWAYS_UNSIGNABLE_HEADERS } from "./constants"; import { getCanonicalHeaders } from "./getCanonicalHeaders"; @@ -49,6 +50,24 @@ describe("getCanonicalHeaders", () => { }); }); + it("should ignore headers with undefined values", () => { + const headers: HeaderBag = { + "x-amz-user-agent": "aws-sdk-js-v3", + host: "foo.us-east-1.amazonaws.com", + }; + + (headers.foo as any) = undefined; + const request = new HttpRequest({ + method: "POST", + protocol: "https:", + path: "/", + headers, + hostname: "foo.us-east-1.amazonaws.com", + }); + + expect(getCanonicalHeaders(request)).toEqual(headers); + }); + it("should allow specifying custom unsignable headers", () => { const request = new HttpRequest({ method: "POST", diff --git a/packages/signature-v4/src/getCanonicalHeaders.ts b/packages/signature-v4/src/getCanonicalHeaders.ts index 927d2987c814..66c49fa09366 100644 --- a/packages/signature-v4/src/getCanonicalHeaders.ts +++ b/packages/signature-v4/src/getCanonicalHeaders.ts @@ -12,6 +12,10 @@ export const getCanonicalHeaders = ( ): HeaderBag => { const canonical: HeaderBag = {}; for (const headerName of Object.keys(headers).sort()) { + if (!headers[headerName]) { + continue; + } + const canonicalHeaderName = headerName.toLowerCase(); if ( canonicalHeaderName in ALWAYS_UNSIGNABLE_HEADERS ||