Skip to content

Commit eea3984

Browse files
authored
fix: include headers in presigning requests (#556)
1 parent d12febb commit eea3984

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/PresignerGenerator.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ class PresignerGenerator : KotlinIntegration {
294294
presignConfigFnVisitor.renderQueryParameters(writer)
295295
write("duration,")
296296
write("${presignableOp.signBody},")
297-
write("SigningLocation.QUERY_STRING")
297+
write("SigningLocation.QUERY_STRING,")
298+
write("httpRequestBuilder.headers.build(),")
298299
}
299300
}
300301
}

codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/PresignerGeneratorTest.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ class PresignerGeneratorTest {
141141
httpRequestBuilder.url.parameters.build(),
142142
duration,
143143
false,
144-
SigningLocation.QUERY_STRING
144+
SigningLocation.QUERY_STRING,
145+
httpRequestBuilder.headers.build(),
145146
)
146147
}
147148
@@ -179,7 +180,8 @@ class PresignerGeneratorTest {
179180
httpRequestBuilder.url.parameters.build(),
180181
duration,
181182
false,
182-
SigningLocation.QUERY_STRING
183+
SigningLocation.QUERY_STRING,
184+
httpRequestBuilder.headers.build(),
183185
)
184186
}
185187
@@ -217,7 +219,8 @@ class PresignerGeneratorTest {
217219
httpRequestBuilder.url.parameters.build(),
218220
duration,
219221
false,
220-
SigningLocation.QUERY_STRING
222+
SigningLocation.QUERY_STRING,
223+
httpRequestBuilder.headers.build(),
221224
)
222225
}
223226
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0.
4+
*/
5+
package aws.sdk.kotlin.services.s3.presigners
6+
7+
import aws.sdk.kotlin.runtime.auth.credentials.StaticCredentialsProvider
8+
import aws.sdk.kotlin.services.s3.S3Client
9+
import aws.sdk.kotlin.services.s3.model.ObjectCannedAcl
10+
import aws.sdk.kotlin.services.s3.model.PutObjectRequest
11+
import aws.smithy.kotlin.runtime.util.InternalApi
12+
import aws.smithy.kotlin.runtime.util.text.urlDecodeComponent
13+
import kotlinx.coroutines.test.runTest
14+
import kotlin.test.Test
15+
import kotlin.test.assertEquals
16+
import kotlin.test.assertNotNull
17+
import kotlin.test.assertTrue
18+
import kotlin.time.Duration.Companion.days
19+
20+
class PresignersTest {
21+
@OptIn(InternalApi::class)
22+
@Test
23+
fun testPresignHeaders() = runTest {
24+
val req = PutObjectRequest {
25+
bucket = "foo"
26+
key = "bar"
27+
acl = ObjectCannedAcl.BucketOwnerFullControl
28+
}
29+
val config = S3Client.Config {
30+
region = "us-west-2"
31+
credentialsProvider = StaticCredentialsProvider {
32+
accessKeyId = "AKID"
33+
secretAccessKey = "secret"
34+
}
35+
}
36+
val presigned = req.presign(config, 1.days)
37+
38+
val aclHeader = presigned.headers["x-amz-acl"]
39+
assertNotNull(aclHeader, "Expected x-amz-acl header to be included in presigned request")
40+
assertEquals("bucket-owner-full-control", aclHeader)
41+
42+
val signedHeadersString = presigned.url.parameters["X-Amz-SignedHeaders"]
43+
assertNotNull(signedHeadersString, "Expected X-Amz-SignedHeaders query parameter in URL")
44+
45+
val signedHeaders = signedHeadersString.urlDecodeComponent().split(';')
46+
assertTrue(signedHeaders.contains("x-amz-acl"), "Expected x-amz-acl to be signed but only found $signedHeaders")
47+
}
48+
}

0 commit comments

Comments
 (0)