Skip to content

Commit 37f574f

Browse files
authored
fix(s3-request-presigner): add port to host name if missed (#3897)
1 parent b439cea commit 37f574f

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,34 @@ describe("s3 presigner", () => {
116116
host: `${minimalRequest.hostname}:${port}`,
117117
});
118118
});
119+
120+
it("should inject host header with port if current host header missing port", async () => {
121+
const signer = new S3RequestPresigner(s3ResolvedConfig);
122+
const port = 12345;
123+
const signed = await signer.presign({
124+
...minimalRequest,
125+
headers: {
126+
host: minimalRequest.hostname,
127+
},
128+
port,
129+
});
130+
expect(signed.headers).toMatchObject({
131+
host: `${minimalRequest.hostname}:${port}`,
132+
});
133+
});
134+
135+
it("should NOT overwrite host header if different host header is already set", async () => {
136+
const signer = new S3RequestPresigner(s3ResolvedConfig);
137+
const port = 12345;
138+
const signed = await signer.presign({
139+
...minimalRequest,
140+
headers: {
141+
host: "proxy." + minimalRequest.hostname,
142+
},
143+
port,
144+
});
145+
expect(signed.headers).toMatchObject({
146+
host: "proxy." + minimalRequest.hostname,
147+
});
148+
});
119149
});

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class S3RequestPresigner implements RequestPresigner {
2424
this.signer = new SignatureV4MultiRegion(resolvedOptions);
2525
}
2626

27-
public async presign(
27+
public presign(
2828
requestToSign: IHttpRequest,
2929
{ unsignableHeaders = new Set(), unhoistableHeaders = new Set(), ...options }: RequestPresigningArguments = {}
3030
): Promise<IHttpRequest> {
@@ -38,11 +38,12 @@ export class S3RequestPresigner implements RequestPresigner {
3838
unhoistableHeaders.add(header);
3939
});
4040
requestToSign.headers[SHA256_HEADER] = UNSIGNED_PAYLOAD;
41-
if (!requestToSign.headers["host"]) {
42-
requestToSign.headers.host = requestToSign.hostname;
43-
if (requestToSign.port) {
44-
requestToSign.headers.host = `${requestToSign.headers.host}:${requestToSign.port}`;
45-
}
41+
42+
const currentHostHeader = requestToSign.headers.host;
43+
const port = requestToSign.port;
44+
const expectedHostHeader = `${requestToSign.hostname}${requestToSign.port != null ? ":" + port : ""}`;
45+
if (!currentHostHeader || (currentHostHeader === requestToSign.hostname && requestToSign.port != null)) {
46+
requestToSign.headers.host = expectedHostHeader;
4647
}
4748
return this.signer.presign(requestToSign, {
4849
expiresIn: 900,

0 commit comments

Comments
 (0)