Skip to content

Commit 1b22923

Browse files
committed
fix(signature-v4): add hoistable headers config
1 parent 41a96d4 commit 1b22923

File tree

5 files changed

+51
-3
lines changed

5 files changed

+51
-3
lines changed

.changeset/happy-emus-crash.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@smithy/signature-v4": minor
3+
"@smithy/types": minor
4+
---
5+
6+
configurable hoisted headers

packages/signature-v4/src/SignatureV4.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export class SignatureV4 implements RequestPresigner, RequestSigner, StringSigne
131131
unsignableHeaders,
132132
unhoistableHeaders,
133133
signableHeaders,
134+
hoistableHeaders,
134135
signingRegion,
135136
signingService,
136137
} = options;
@@ -146,7 +147,7 @@ export class SignatureV4 implements RequestPresigner, RequestSigner, StringSigne
146147
}
147148

148149
const scope = createScope(shortDate, region, signingService ?? this.service);
149-
const request = moveHeadersToQuery(prepareRequest(originalRequest), { unhoistableHeaders });
150+
const request = moveHeadersToQuery(prepareRequest(originalRequest), { unhoistableHeaders, hoistableHeaders });
150151

151152
if (credentials.sessionToken) {
152153
request.query[TOKEN_QUERY_PARAM] = credentials.sessionToken;

packages/signature-v4/src/moveHeadersToQuery.spec.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,36 @@ describe("moveHeadersToQuery", () => {
9999
SNAP: "crackle, pop",
100100
});
101101
});
102+
103+
it("should obey hoistableHeaders configuration over unhoistableHeaders", () => {
104+
const req = moveHeadersToQuery(
105+
new HttpRequest({
106+
...minimalRequest,
107+
headers: {
108+
Host: "www.example.com",
109+
"X-Amz-Website-Redirect-Location": "/index.html",
110+
Foo: "bar",
111+
fizz: "buzz",
112+
SNAP: "crackle, pop",
113+
"X-Amz-Storage-Class": "STANDARD_IA",
114+
},
115+
}),
116+
{
117+
hoistableHeaders: new Set(["x-amz-website-redirect-location", "snap"]),
118+
unhoistableHeaders: new Set(["x-amz-website-redirect-location"]),
119+
}
120+
);
121+
122+
expect(req.query).toEqual({
123+
SNAP: "crackle, pop",
124+
"X-Amz-Storage-Class": "STANDARD_IA",
125+
"X-Amz-Website-Redirect-Location": "/index.html",
126+
});
127+
128+
expect(req.headers).toEqual({
129+
Host: "www.example.com",
130+
Foo: "bar",
131+
fizz: "buzz",
132+
});
133+
});
102134
});

packages/signature-v4/src/moveHeadersToQuery.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import type { HttpRequest as IHttpRequest, QueryParameterBag } from "@smithy/typ
66
*/
77
export const moveHeadersToQuery = (
88
request: IHttpRequest,
9-
options: { unhoistableHeaders?: Set<string> } = {}
9+
options: { unhoistableHeaders?: Set<string>; hoistableHeaders?: Set<string> } = {}
1010
): IHttpRequest & { query: QueryParameterBag } => {
1111
const { headers, query = {} as QueryParameterBag } = HttpRequest.clone(request);
1212
for (const name of Object.keys(headers)) {
1313
const lname = name.toLowerCase();
14-
if (lname.slice(0, 6) === "x-amz-" && !options.unhoistableHeaders?.has(lname)) {
14+
if (
15+
(lname.slice(0, 6) === "x-amz-" && !options.unhoistableHeaders?.has(lname)) ||
16+
options.hoistableHeaders?.has(lname)
17+
) {
1518
query[name] = headers[name];
1619
delete headers[name];
1720
}

packages/types/src/signature.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ export interface RequestPresigningArguments extends RequestSigningArguments {
7575
* lower case and then checked for existence in the unhoistableHeaders set.
7676
*/
7777
unhoistableHeaders?: Set<string>;
78+
79+
/**
80+
* This overrides any values set by unhoistableHeaders.
81+
* These headers will be hoisted into the query string and signed.
82+
*/
83+
hoistableHeaders?: Set<string>;
7884
}
7985

8086
/**

0 commit comments

Comments
 (0)