Skip to content

Commit d4b119d

Browse files
authored
fix: s3 default execution context attributes overriding previous section writers (#1166)
1 parent ca6631a commit d4b119d

File tree

3 files changed

+82
-5
lines changed

3 files changed

+82
-5
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "f0f7ca8d-5690-4449-ace1-e826656a662c",
3+
"type": "bugfix",
4+
"description": "(**s3**) Fix default execution context attributes",
5+
"issues": [
6+
"awslabs/aws-sdk-kotlin#1165"
7+
]
8+
}

codegen/aws-sdk-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/customization/s3/S3SigningConfig.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
package aws.sdk.kotlin.codegen.customization.s3
77

88
import software.amazon.smithy.kotlin.codegen.KotlinSettings
9-
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
109
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
10+
import software.amazon.smithy.kotlin.codegen.integration.AppendingSectionWriter
1111
import software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration
1212
import software.amazon.smithy.kotlin.codegen.integration.SectionWriterBinding
1313
import software.amazon.smithy.kotlin.codegen.model.expectShape
@@ -27,10 +27,12 @@ class S3SigningConfig : KotlinIntegration {
2727
override fun enabledForService(model: Model, settings: KotlinSettings) =
2828
model.expectShape<ServiceShape>(settings.service).isS3
2929

30-
override val sectionWriters: List<SectionWriterBinding> = listOf(
31-
SectionWriterBinding(HttpProtocolClientGenerator.MergeServiceDefaults, ::renderDefaultSigningContext),
32-
)
33-
private fun renderDefaultSigningContext(writer: KotlinWriter, previousValue: String?) {
30+
override val sectionWriters: List<SectionWriterBinding>
31+
get() = listOf(
32+
SectionWriterBinding(HttpProtocolClientGenerator.MergeServiceDefaults, renderDefaultSigningContext),
33+
)
34+
35+
private val renderDefaultSigningContext = AppendingSectionWriter { writer ->
3436
val signingAttrs = RuntimeTypes.Auth.Signing.AwsSigningCommon.AwsSigningAttributes
3537
// https://github.com/awslabs/aws-sdk-kotlin/issues/200
3638
writer.putIfAbsent(signingAttrs, "NormalizeUriPath", "false")
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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
6+
7+
import aws.sdk.kotlin.runtime.client.AwsClientOption
8+
import aws.smithy.kotlin.runtime.auth.AuthSchemeId
9+
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
10+
import aws.smithy.kotlin.runtime.auth.awssigning.AwsSignedBodyHeader
11+
import aws.smithy.kotlin.runtime.auth.awssigning.AwsSigningAttributes
12+
import aws.smithy.kotlin.runtime.client.RequestInterceptorContext
13+
import aws.smithy.kotlin.runtime.client.SdkClientOption
14+
import aws.smithy.kotlin.runtime.collections.get
15+
import aws.smithy.kotlin.runtime.http.auth.*
16+
import aws.smithy.kotlin.runtime.http.interceptors.HttpInterceptor
17+
import aws.smithy.kotlin.runtime.httptest.buildTestConnection
18+
import aws.smithy.kotlin.runtime.identity.IdentityProvider
19+
import aws.smithy.kotlin.runtime.identity.IdentityProviderConfig
20+
import aws.smithy.kotlin.runtime.io.use
21+
import kotlinx.coroutines.test.runTest
22+
import kotlin.test.Test
23+
import kotlin.test.assertEquals
24+
import kotlin.test.assertNotNull
25+
26+
class DefaultsTest {
27+
28+
/**
29+
* Test execution context gets filled with defaults. This applies to any generated client but S3 has some additional
30+
* things added.
31+
*
32+
* See [aws-sdk-kotlin#1164](https://github.com/awslabs/aws-sdk-kotlin/issues/1165S)
33+
*/
34+
@Test
35+
fun testDefaultExecutionContext() = runTest {
36+
val mockEngine = buildTestConnection { expect() }
37+
val noAuth = object : AuthScheme {
38+
override val schemeId: AuthSchemeId = AuthSchemeId.AwsSigV4
39+
override val signer: HttpSigner = AnonymousHttpSigner
40+
override fun identityProvider(identityProviderConfig: IdentityProviderConfig): IdentityProvider = AnonymousIdentityProvider
41+
}
42+
43+
S3Client {
44+
region = "us-east-1"
45+
httpClient = mockEngine
46+
authSchemes = listOf(noAuth)
47+
interceptors += object : HttpInterceptor {
48+
override fun readBeforeExecution(context: RequestInterceptorContext<Any>) {
49+
assertNotNull(context.executionContext[SdkClientOption.ClientName])
50+
assertNotNull(context.executionContext[SdkClientOption.LogMode])
51+
assertNotNull(context.executionContext[AwsSigningAttributes.CredentialsProvider])
52+
53+
assertEquals(region, context.executionContext[AwsClientOption.Region])
54+
assertEquals(region, context.executionContext[AwsSigningAttributes.SigningRegion])
55+
assertEquals("s3", context.executionContext[AwsSigningAttributes.SigningService])
56+
57+
// S3 specific
58+
assertEquals(false, context.executionContext[AwsSigningAttributes.NormalizeUriPath])
59+
assertEquals(false, context.executionContext[AwsSigningAttributes.UseDoubleUriEncode])
60+
assertEquals(AwsSignedBodyHeader.X_AMZ_CONTENT_SHA256, context.executionContext[AwsSigningAttributes.SignedBodyHeader])
61+
}
62+
}
63+
}.use { s3 ->
64+
s3.listBuckets()
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)