Skip to content

Commit c2f5ebb

Browse files
authored
misc: remove "Content-Length" headers for aws-chunked requests (#1053)
1 parent e0b1254 commit c2f5ebb

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "68f9a5ff-ff1e-4b7f-bf55-02ad98170cd9",
3+
"type": "misc",
4+
"description": "Remove \"Content-Length\" header for requests made with `aws-chunked` encoding"
5+
}

runtime/auth/aws-signing-common/common/src/aws/smithy/kotlin/runtime/auth/awssigning/internal/AwsChunkedUtil.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ public val AwsSigningConfig.useAwsChunkedEncoding: Boolean
6666
public fun HttpRequestBuilder.setAwsChunkedHeaders() {
6767
headers.append("Content-Encoding", "aws-chunked")
6868
headers["Transfer-Encoding"] = "chunked"
69-
headers["X-Amz-Decoded-Content-Length"] = body.contentLength!!.toString()
69+
headers["X-Amz-Decoded-Content-Length"] = headers["Content-Length"] ?: body.contentLength?.toString() ?: throw ClientException(
70+
"Expected \"Content-Length\" header or `body.contentLength` to be set for aws-chunked",
71+
)
72+
headers.remove("Content-Length") // Any precalculated Content-Length is no longer correct after we chunk the body up
7073
}
7174

7275
/**

runtime/auth/http-auth-aws/common/test/aws/smithy/kotlin/runtime/http/auth/AwsHttpSignerTestBase.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ public abstract class AwsHttpSignerTestBase(
148148
val op = buildOperation(streaming = true, replayable = false, requestBody = "a".repeat(AWS_CHUNKED_THRESHOLD + 1))
149149
val expectedDate = "20201016T195600Z"
150150
val expectedSig = "AWS4-HMAC-SHA256 Credential=AKID/20201016/us-east-1/demo/aws4_request, " +
151-
"SignedHeaders=content-encoding;content-length;host;transfer-encoding;x-amz-archive-description;x-amz-date;x-amz-decoded-content-length;x-amz-security-token, " +
152-
"Signature=dec1a06b61f953afe430ce4a0f10ee8d5ad3d29696516c4ccda23a0aab6664d5"
151+
"SignedHeaders=content-encoding;host;transfer-encoding;x-amz-archive-description;x-amz-date;x-amz-decoded-content-length;x-amz-security-token, " +
152+
"Signature=ac341b9b248a0b23d2fcd9f7e805f4eb0b8a1b789bb23a8ec6adc6c48dd084ad"
153153

154154
val signed = getSignedRequest(op)
155155
assertEquals(expectedDate, signed.headers["X-Amz-Date"])
@@ -161,8 +161,8 @@ public abstract class AwsHttpSignerTestBase(
161161
val op = buildOperation(streaming = true, replayable = true, requestBody = "a".repeat(AWS_CHUNKED_THRESHOLD + 1))
162162
val expectedDate = "20201016T195600Z"
163163
val expectedSig = "AWS4-HMAC-SHA256 Credential=AKID/20201016/us-east-1/demo/aws4_request, " +
164-
"SignedHeaders=content-encoding;content-length;host;transfer-encoding;x-amz-archive-description;x-amz-date;x-amz-decoded-content-length;x-amz-security-token, " +
165-
"Signature=dec1a06b61f953afe430ce4a0f10ee8d5ad3d29696516c4ccda23a0aab6664d5"
164+
"SignedHeaders=content-encoding;host;transfer-encoding;x-amz-archive-description;x-amz-date;x-amz-decoded-content-length;x-amz-security-token, " +
165+
"Signature=ac341b9b248a0b23d2fcd9f7e805f4eb0b8a1b789bb23a8ec6adc6c48dd084ad"
166166

167167
val signed = getSignedRequest(op)
168168
assertEquals(expectedDate, signed.headers["X-Amz-Date"])
@@ -175,8 +175,8 @@ public abstract class AwsHttpSignerTestBase(
175175
val expectedDate = "20201016T195600Z"
176176
// should have same signature as testSignAwsChunkedStreamNonReplayable(), except for the hash, since the body is different
177177
val expectedSig = "AWS4-HMAC-SHA256 Credential=AKID/20201016/us-east-1/demo/aws4_request, " +
178-
"SignedHeaders=content-encoding;content-length;host;transfer-encoding;x-amz-archive-description;x-amz-date;x-amz-decoded-content-length;x-amz-security-token, " +
179-
"Signature=9600a7fbf17056d41557ec5d6abfe7b5db4a75222e563f5e16afde9c1c0014bb"
178+
"SignedHeaders=content-encoding;host;transfer-encoding;x-amz-archive-description;x-amz-date;x-amz-decoded-content-length;x-amz-security-token, " +
179+
"Signature=3f0277123c9ed8a8858f793886a0ac0fcb457bc54401ffc22d470f373397cff0"
180180

181181
val signed = getSignedRequest(op)
182182
assertEquals(expectedDate, signed.headers["X-Amz-Date"])

0 commit comments

Comments
 (0)