Skip to content

Commit 33dd7eb

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

File tree

4 files changed

+19
-3
lines changed

4 files changed

+19
-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.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)