From 794772215278d7f02c9707fc5a62c5c22cbf53db Mon Sep 17 00:00:00 2001 From: George Fu Date: Mon, 8 Jul 2024 18:41:13 +0000 Subject: [PATCH 1/4] fix(middleware-eventstream): lowercase headers more consistently --- .../credential-provider-http/src/fromHttp/fromHttp.spec.ts | 2 +- .../src/fromHttp/requestHelpers.spec.ts | 6 +++--- .../src/eventStreamHeaderMiddleware.ts | 2 +- .../src/middleware-eventstream.integ.spec.ts | 6 +++--- .../src/middleware-sdk-transcribe-streaming.integ.spec.ts | 2 +- .../src/middleware-websocket-endpoint.spec.ts | 3 +-- .../src/middleware-websocket-endpoint.ts | 2 +- .../src/middleware-websocket.integ.spec.ts | 2 +- packages/s3-request-presigner/src/presigner.spec.ts | 2 +- 9 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/credential-provider-http/src/fromHttp/fromHttp.spec.ts b/packages/credential-provider-http/src/fromHttp/fromHttp.spec.ts index f88c6e0ffd2c..903bb9c12d96 100644 --- a/packages/credential-provider-http/src/fromHttp/fromHttp.spec.ts +++ b/packages/credential-provider-http/src/fromHttp/fromHttp.spec.ts @@ -25,7 +25,7 @@ const mockHandle = jest.fn().mockResolvedValue({ response: new HttpResponse({ statusCode: 200, headers: { - "Content-Type": "application/json", + "content-type": "application/json", }, body: Readable.from([""]), }), diff --git a/packages/credential-provider-http/src/fromHttp/requestHelpers.spec.ts b/packages/credential-provider-http/src/fromHttp/requestHelpers.spec.ts index ddb1d4b069d1..df2f52cc0719 100644 --- a/packages/credential-provider-http/src/fromHttp/requestHelpers.spec.ts +++ b/packages/credential-provider-http/src/fromHttp/requestHelpers.spec.ts @@ -17,7 +17,7 @@ describe(getCredentials.name, () => { const response = new HttpResponse({ statusCode: 200, headers: { - "Content-Type": "application/json", + "content-type": "application/json", }, body: Readable.from(JSON.stringify(data)), }); @@ -34,7 +34,7 @@ describe(getCredentials.name, () => { const response = new HttpResponse({ statusCode: 400, headers: { - "Content-Type": "application/json", + "content-type": "application/json", }, body: Readable.from( JSON.stringify({ @@ -57,7 +57,7 @@ describe(getCredentials.name, () => { const response = new HttpResponse({ statusCode: 500, headers: { - "Content-Type": "json", + "content-type": "json", }, body: Readable.from(JSON.stringify({})), }); diff --git a/packages/middleware-eventstream/src/eventStreamHeaderMiddleware.ts b/packages/middleware-eventstream/src/eventStreamHeaderMiddleware.ts index 6e52508d839d..1ffe2a36ee54 100644 --- a/packages/middleware-eventstream/src/eventStreamHeaderMiddleware.ts +++ b/packages/middleware-eventstream/src/eventStreamHeaderMiddleware.ts @@ -5,7 +5,7 @@ export const eventStreamHeaderMiddleware: BuildMiddleware = (next) => if (!HttpRequest.isInstance(request)) return next(args); request.headers = { ...request.headers, - "Content-Type": "application/vnd.amazon.eventstream", + "content-type": "application/vnd.amazon.eventstream", "x-amz-content-sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", }; return next({ diff --git a/packages/middleware-eventstream/src/middleware-eventstream.integ.spec.ts b/packages/middleware-eventstream/src/middleware-eventstream.integ.spec.ts index 8bafcb49fe09..2216bdda63bc 100644 --- a/packages/middleware-eventstream/src/middleware-eventstream.integ.spec.ts +++ b/packages/middleware-eventstream/src/middleware-eventstream.integ.spec.ts @@ -20,7 +20,7 @@ describe("middleware-eventstream", () => { requireRequestsFrom(client).toMatch({ headers: { - "Content-Type": "application/vnd.amazon.eventstream", + "content-type": "application/vnd.amazon.eventstream", "x-amz-content-sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", }, }); @@ -51,7 +51,7 @@ describe("middleware-eventstream", () => { requireRequestsFrom(client).toMatch({ headers: { - "Content-Type": "application/vnd.amazon.eventstream", + "content-type": "application/vnd.amazon.eventstream", "x-amz-content-sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", }, }); @@ -83,7 +83,7 @@ describe("middleware-eventstream", () => { requireRequestsFrom(client).toMatch({ headers: { - "Content-Type": "application/vnd.amazon.eventstream", + "content-type": "application/vnd.amazon.eventstream", "x-amz-content-sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", }, }); diff --git a/packages/middleware-sdk-transcribe-streaming/src/middleware-sdk-transcribe-streaming.integ.spec.ts b/packages/middleware-sdk-transcribe-streaming/src/middleware-sdk-transcribe-streaming.integ.spec.ts index af595d18996f..1e01f09cffd9 100644 --- a/packages/middleware-sdk-transcribe-streaming/src/middleware-sdk-transcribe-streaming.integ.spec.ts +++ b/packages/middleware-sdk-transcribe-streaming/src/middleware-sdk-transcribe-streaming.integ.spec.ts @@ -12,7 +12,7 @@ describe("middleware-sdk-transcribe-streaming", () => { requireRequestsFrom(client).toMatch({ headers: { - "Content-Type": /undefined/, + "content-type": /undefined/, host: "transcribestreaming.us-west-2.amazonaws.com:8443", }, query: { diff --git a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts index 0472fc1f1efe..91d1bb026104 100644 --- a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts +++ b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts @@ -42,7 +42,7 @@ describe(websocketEndpointMiddleware.name, () => { const request = new HttpRequest({ headers: { "content-type": "application/vnd.amazon.eventstream", - "Content-Type": "application/vnd.amazon.eventstream", + "content-type": "application/vnd.amazon.eventstream", "x-amz-content-sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", "X-Amz-Content-Sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", }, @@ -51,7 +51,6 @@ describe(websocketEndpointMiddleware.name, () => { expect(HttpRequest.isInstance(args.request)).toBeTruthy(); const processed = args.request as HttpRequest; expect(processed.headers["content-type"]).toBeUndefined(); - expect(processed.headers["Content-Type"]).toBeUndefined(); expect(processed.headers["x-amz-content-sha256"]).toBeUndefined(); expect(processed.headers["X-Amz-Content-Sha256"]).toBeUndefined(); done(); diff --git a/packages/middleware-websocket/src/middleware-websocket-endpoint.ts b/packages/middleware-websocket/src/middleware-websocket-endpoint.ts index ed36f4a1ef32..af5b168d173f 100644 --- a/packages/middleware-websocket/src/middleware-websocket-endpoint.ts +++ b/packages/middleware-websocket/src/middleware-websocket-endpoint.ts @@ -37,7 +37,7 @@ export const websocketEndpointMiddleware = // 'Content-Type' and 'x-amz-content-sha256' headers are normally set for // event stream, but WebSocket doesn't require it. // See: 'eventStreamHeaderMiddleware' in @aws-sdk/middleware-eventstream - delete headers["Content-Type"]; + delete headers["content-type"]; delete headers["x-amz-content-sha256"]; for (const name of Object.keys(headers)) { diff --git a/packages/middleware-websocket/src/middleware-websocket.integ.spec.ts b/packages/middleware-websocket/src/middleware-websocket.integ.spec.ts index 2c4b888ca4c5..7155b92c4979 100644 --- a/packages/middleware-websocket/src/middleware-websocket.integ.spec.ts +++ b/packages/middleware-websocket/src/middleware-websocket.integ.spec.ts @@ -21,7 +21,7 @@ describe("middleware-websocket", () => { path: "/start-face-liveness-session-websocket", headers: { host: "streaming-rekognition.us-west-2.amazonaws.com", - "Content-Type": /^undefined$/, + "content-type": /^undefined$/, "x-amz-content-sha256": /^undefined$/, "user-agent": /^aws-sdk-js/, }, diff --git a/packages/s3-request-presigner/src/presigner.spec.ts b/packages/s3-request-presigner/src/presigner.spec.ts index 016d873f211e..73220f9015f6 100644 --- a/packages/s3-request-presigner/src/presigner.spec.ts +++ b/packages/s3-request-presigner/src/presigner.spec.ts @@ -71,7 +71,7 @@ describe("s3 presigner", () => { ...minimalRequest, headers: { ...minimalRequest.headers, - "Content-Type": "application/octet-stream", + "content-type": "application/octet-stream", }, }; const signed = await signer.presign(requestWithContentTypeHeader, presigningOptions); From 6ec19eda422391884e25173e1d8a2a173dd61f1a Mon Sep 17 00:00:00 2001 From: George Fu Date: Tue, 9 Jul 2024 10:31:16 -0400 Subject: [PATCH 2/4] fix: restore test in packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts Co-authored-by: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> --- .../src/middleware-websocket-endpoint.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts index 91d1bb026104..ee22859e9d27 100644 --- a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts +++ b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts @@ -42,7 +42,7 @@ describe(websocketEndpointMiddleware.name, () => { const request = new HttpRequest({ headers: { "content-type": "application/vnd.amazon.eventstream", - "content-type": "application/vnd.amazon.eventstream", + "Content-Type": "application/vnd.amazon.eventstream", "x-amz-content-sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", "X-Amz-Content-Sha256": "STREAMING-AWS4-HMAC-SHA256-EVENTS", }, From 6785b79d8bbc16bb03fe86ad48dd4faf2cb3ff59 Mon Sep 17 00:00:00 2001 From: George Fu Date: Tue, 9 Jul 2024 15:25:04 +0000 Subject: [PATCH 3/4] test(middleware-websocket): update unit test for clarity --- .../src/middleware-websocket-endpoint.spec.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts index ee22859e9d27..d76b697cc25a 100644 --- a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts +++ b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts @@ -38,7 +38,7 @@ describe(websocketEndpointMiddleware.name, () => { mw(next as any, {} as any)({ request, input: {} }); }); - it("should remove content-type and sha256 hash header", (done) => { + it("should remove content-type and sha256 hash header without transferring them to query parameters", (done) => { const request = new HttpRequest({ headers: { "content-type": "application/vnd.amazon.eventstream", @@ -50,21 +50,22 @@ describe(websocketEndpointMiddleware.name, () => { const next = (args: BuildHandlerArguments) => { expect(HttpRequest.isInstance(args.request)).toBeTruthy(); const processed = args.request as HttpRequest; - expect(processed.headers["content-type"]).toBeUndefined(); - expect(processed.headers["x-amz-content-sha256"]).toBeUndefined(); - expect(processed.headers["X-Amz-Content-Sha256"]).toBeUndefined(); + const queryKeys = Object.keys(processed.query).map((key) => key.toLowerCase()); + expect(queryKeys).not.toContain("content-type"); + expect(queryKeys).not.toContain("x-amz-content-sha256"); done(); }; const mw = websocketEndpointMiddleware(config, handlerOption); mw(next as any, {} as any)({ request, input: {} }); }); - it("should contains host header after adjustment", (done) => { + it("should contain only a host header after adjustment", (done) => { const request = new HttpRequest({}); const next = (args: BuildHandlerArguments) => { expect(HttpRequest.isInstance(args.request)).toBeTruthy(); const processed = args.request as HttpRequest; - expect(processed.headers["host"]).toBeDefined(); + const headerKeys = Object.keys(processed.headers).map((key) => key.toLowerCase()); + expect(headerKeys).toEqual(["host"]); done(); }; const mw = websocketEndpointMiddleware(config, handlerOption); From 791fcf810c3bba8545d5a3a60bbdf18ae9f390a4 Mon Sep 17 00:00:00 2001 From: George Fu Date: Tue, 9 Jul 2024 15:30:05 +0000 Subject: [PATCH 4/4] test(middleware-websocket): update unit test assertion --- .../src/middleware-websocket-endpoint.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts index d76b697cc25a..fe4658023d32 100644 --- a/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts +++ b/packages/middleware-websocket/src/middleware-websocket-endpoint.spec.ts @@ -66,6 +66,7 @@ describe(websocketEndpointMiddleware.name, () => { const processed = args.request as HttpRequest; const headerKeys = Object.keys(processed.headers).map((key) => key.toLowerCase()); expect(headerKeys).toEqual(["host"]); + expect(processed.headers["host"]).toBeDefined(); done(); }; const mw = websocketEndpointMiddleware(config, handlerOption);