Skip to content

Commit c797084

Browse files
committed
fix(s3-request-presigner): enable overriding hoistable headers
1 parent dddd164 commit c797084

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

packages/s3-request-presigner/src/presigner.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,28 @@ describe("s3 presigner", () => {
108108
expect(signedHeaders).toContain("x-amz-server-side-encryption-customer-algorithm");
109109
});
110110

111+
it("should allow hoisting server-side-encryption headers to query when overridden", async () => {
112+
const signer = new S3RequestPresigner(s3ResolvedConfig);
113+
const signed = await signer.presign(
114+
{
115+
...minimalRequest,
116+
headers: {
117+
...minimalRequest.headers,
118+
"x-amz-server-side-encryption": "kms",
119+
"x-amz-server-side-encryption-customer-algorithm": "AES256",
120+
},
121+
},
122+
{
123+
hoistableHeaders: new Set(["x-amz-server-side-encryption", "x-amz-server-side-encryption-customer-algorithm"]),
124+
}
125+
);
126+
const signedHeadersHeader = signed.query?.["X-Amz-SignedHeaders"];
127+
const signedHeaders =
128+
typeof signedHeadersHeader === "string" ? signedHeadersHeader.split(";") : signedHeadersHeader;
129+
expect(signedHeaders).not.toContain("x-amz-server-side-encryption");
130+
expect(signedHeaders).not.toContain("x-amz-server-side-encryption-customer-algorithm");
131+
});
132+
111133
it("should inject host header with port if not supplied", async () => {
112134
const signer = new S3RequestPresigner(s3ResolvedConfig);
113135
const port = 12345;

packages/s3-request-presigner/src/presigner.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,17 @@ export class S3RequestPresigner implements RequestPresigner {
2626

2727
public presign(
2828
requestToSign: IHttpRequest,
29-
{ unsignableHeaders = new Set(), unhoistableHeaders = new Set(), ...options }: RequestPresigningArguments = {}
29+
{
30+
unsignableHeaders = new Set(),
31+
hoistableHeaders = new Set(),
32+
unhoistableHeaders = new Set(),
33+
...options
34+
}: RequestPresigningArguments = {}
3035
): Promise<IHttpRequest> {
3136
this.prepareRequest(requestToSign, {
3237
unsignableHeaders,
3338
unhoistableHeaders,
39+
hoistableHeaders,
3440
});
3541
return this.signer.presign(requestToSign, {
3642
expiresIn: 900,
@@ -43,11 +49,17 @@ export class S3RequestPresigner implements RequestPresigner {
4349
public presignWithCredentials(
4450
requestToSign: IHttpRequest,
4551
credentials: AwsCredentialIdentity,
46-
{ unsignableHeaders = new Set(), unhoistableHeaders = new Set(), ...options }: RequestPresigningArguments = {}
52+
{
53+
unsignableHeaders = new Set(),
54+
hoistableHeaders = new Set(),
55+
unhoistableHeaders = new Set(),
56+
...options
57+
}: RequestPresigningArguments = {}
4758
): Promise<IHttpRequest> {
4859
this.prepareRequest(requestToSign, {
4960
unsignableHeaders,
5061
unhoistableHeaders,
62+
hoistableHeaders,
5163
});
5264
return this.signer.presignWithCredentials(requestToSign, credentials, {
5365
expiresIn: 900,
@@ -59,15 +71,29 @@ export class S3RequestPresigner implements RequestPresigner {
5971

6072
private prepareRequest(
6173
requestToSign: IHttpRequest,
62-
{ unsignableHeaders = new Set(), unhoistableHeaders = new Set() }: RequestPresigningArguments = {}
74+
{
75+
unsignableHeaders = new Set(),
76+
unhoistableHeaders = new Set(),
77+
hoistableHeaders = new Set(),
78+
}: RequestPresigningArguments = {}
6379
) {
6480
unsignableHeaders.add("content-type");
81+
6582
Object.keys(requestToSign.headers)
6683
.map((header) => header.toLowerCase())
6784
.filter((header) => header.startsWith("x-amz-server-side-encryption"))
6885
.forEach((header) => {
69-
unhoistableHeaders.add(header);
86+
if (!hoistableHeaders.has(header)) {
87+
/**
88+
* For smoother backwards compatibility with pre-GA PR
89+
* https://github.com/aws/aws-sdk-js-v3/issues/1576,
90+
* x-amz-sse headers are by default unhoisted,
91+
* but can be overridden.
92+
*/
93+
unhoistableHeaders.add(header);
94+
}
7095
});
96+
7197
requestToSign.headers[SHA256_HEADER] = UNSIGNED_PAYLOAD;
7298

7399
const currentHostHeader = requestToSign.headers.host;

0 commit comments

Comments
 (0)