Skip to content

Commit 0bafdcc

Browse files
committed
Unit tests pass
1 parent d085dec commit 0bafdcc

26 files changed

+1542
-425
lines changed

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/config/AbstractAwsSdkClientFactory.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,9 @@ public abstract class AbstractAwsSdkClientFactory<
9898
}
9999

100100
if (config is HttpChecksumClientConfig.Builder) {
101-
// TODO - business metric
102101
config.requestChecksumCalculation =
103102
config.requestChecksumCalculation ?: resolveRequestChecksumCalculation(platform, profile)
104103

105-
// TODO - business metric
106104
config.responseChecksumValidation =
107105
config.responseChecksumValidation ?: resolveResponseChecksumValidation(platform, profile)
108106
}

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/config/checksums/ResolveRequestChecksumCalculation.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ import java.util.*
1515
* todo
1616
*/
1717
@InternalSdkApi
18-
public suspend fun resolveRequestChecksumCalculation(platform: PlatformProvider = PlatformProvider.System, profile: LazyAsyncValue<AwsProfile>): ChecksumConfigOption? {
19-
AwsSdkSetting.AwsRequestChecksumCalculation.resolve(platform) ?: profile.get().requestChecksumCalculation?.let {
20-
try {
21-
return ChecksumConfigOption.valueOf(it.uppercase(Locale.getDefault()))
22-
} catch (_: IllegalArgumentException) {
23-
throw ConfigurationException(
18+
public suspend fun resolveRequestChecksumCalculation(platform: PlatformProvider = PlatformProvider.System, profile: LazyAsyncValue<AwsProfile>): ChecksumConfigOption {
19+
val unparsedString = AwsSdkSetting.AwsRequestChecksumCalculation.resolve(platform) ?: profile.get().requestChecksumCalculation
20+
return unparsedString?.let {
21+
when (unparsedString.uppercase()) {
22+
"WHEN_SUPPORTED" -> ChecksumConfigOption.WHEN_SUPPORTED
23+
"WHEN_REQUIRED" -> ChecksumConfigOption.WHEN_REQUIRED
24+
else -> throw ConfigurationException(
2425
"'$it' is not a valid value for request checksum calculation. Valid values are: ${ChecksumConfigOption.entries.toTypedArray()}",
2526
)
2627
}
27-
}
28-
return null
28+
} ?: ChecksumConfigOption.WHEN_SUPPORTED
2929
}

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/config/checksums/ResolveResponseChecksumValidation.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ import java.util.*
1515
* todo
1616
*/
1717
@InternalSdkApi
18-
public suspend fun resolveResponseChecksumValidation(platform: PlatformProvider = PlatformProvider.System, profile: LazyAsyncValue<AwsProfile>): ChecksumConfigOption? {
19-
AwsSdkSetting.AwsResponseChecksumValidation.resolve(platform) ?: profile.get().responseChecksumValidation?.let {
20-
try {
21-
return ChecksumConfigOption.valueOf(it.uppercase(Locale.getDefault()))
22-
} catch (_: IllegalArgumentException) {
23-
throw ConfigurationException(
24-
"'$it' is not a valid value for response checksum validation. Valid values are: ${ChecksumConfigOption.entries.toTypedArray()}",
18+
public suspend fun resolveResponseChecksumValidation(platform: PlatformProvider = PlatformProvider.System, profile: LazyAsyncValue<AwsProfile>): ChecksumConfigOption {
19+
val unparsedString = AwsSdkSetting.AwsResponseChecksumValidation.resolve(platform) ?: profile.get().responseChecksumValidation
20+
return unparsedString?.let {
21+
when (unparsedString.uppercase()) {
22+
"WHEN_SUPPORTED" -> ChecksumConfigOption.WHEN_SUPPORTED
23+
"WHEN_REQUIRED" -> ChecksumConfigOption.WHEN_REQUIRED
24+
else -> throw ConfigurationException(
25+
"'$it' is not a valid value for request checksum calculation. Valid values are: ${ChecksumConfigOption.entries.toTypedArray()}",
2526
)
2627
}
27-
}
28-
return null
28+
} ?: ChecksumConfigOption.WHEN_SUPPORTED
2929
}

codegen/aws-sdk-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/customization/flexiblechecksums/FlexibleChecksumsRequest.kt

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,23 @@ package aws.sdk.kotlin.codegen.customization.flexiblechecksums
66

77
import software.amazon.smithy.aws.traits.HttpChecksumTrait
88
import software.amazon.smithy.kotlin.codegen.KotlinSettings
9+
import software.amazon.smithy.kotlin.codegen.core.CodegenContext
910
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
1011
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
1112
import software.amazon.smithy.kotlin.codegen.core.withBlock
1213
import software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration
1314
import software.amazon.smithy.kotlin.codegen.model.*
1415
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
1516
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolMiddleware
17+
import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigProperty
18+
import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigPropertyType
1619
import software.amazon.smithy.kotlin.codegen.utils.getOrNull
1720
import software.amazon.smithy.model.Model
1821
import software.amazon.smithy.model.shapes.OperationShape
22+
import software.amazon.smithy.model.shapes.ShapeId
1923
import software.amazon.smithy.model.shapes.StructureShape
24+
import software.amazon.smithy.model.traits.HttpPayloadTrait
25+
import software.amazon.smithy.model.traits.StreamingTrait
2026

2127
/**
2228
* Adds a middleware that enables sending flexible checksums during an HTTP request
@@ -26,8 +32,61 @@ class FlexibleChecksumsRequest : KotlinIntegration {
2632
.shapes<OperationShape>()
2733
.any { it.hasTrait<HttpChecksumTrait>() }
2834

35+
override fun additionalServiceConfigProps(ctx: CodegenContext): List<ConfigProperty> =
36+
listOf(
37+
ConfigProperty {
38+
name = "requestChecksumCalculation"
39+
symbol = RuntimeTypes.SmithyClient.Config.ChecksumConfigOption
40+
baseClass = RuntimeTypes.SmithyClient.Config.HttpChecksumClientConfig
41+
useNestedBuilderBaseClass()
42+
documentation = "" // todo
43+
propertyType = ConfigPropertyType.RequiredWithDefault("ChecksumConfigOption.WHEN_SUPPORTED")
44+
},
45+
)
46+
47+
private val operationsWithStreamingPayloads = mutableListOf<ShapeId>()
48+
49+
override fun preprocessModel(model: Model, settings: KotlinSettings): Model {
50+
model.operationShapes.forEach { operationShape ->
51+
52+
val operationInput = model.expectShape<StructureShape>(operationShape.inputShape)
53+
54+
operationInput.members().find { it.hasTrait<HttpPayloadTrait>() }?.let { httpPayload ->
55+
if (model.getShape(httpPayload.target).get().hasTrait<StreamingTrait>()) {
56+
operationsWithStreamingPayloads.add(operationShape.id)
57+
}
58+
}
59+
}
60+
61+
return model
62+
}
63+
2964
override fun customizeMiddleware(ctx: ProtocolGenerator.GenerationContext, resolved: List<ProtocolMiddleware>) =
30-
resolved + flexibleChecksumsRequestMiddleware
65+
resolved + flexibleChecksumsRequestMiddleware + configBusinessMetrics
66+
67+
private val configBusinessMetrics = object : ProtocolMiddleware {
68+
override val name: String = "requestChecksumCalculationBusinessMetric"
69+
70+
override fun isEnabledFor(ctx: ProtocolGenerator.GenerationContext, op: OperationShape): Boolean =
71+
op.hasTrait<HttpChecksumTrait>()
72+
73+
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
74+
writer.withBlock("when(config.requestChecksumCalculation) {", "}") {
75+
writer.write(
76+
"#T.WHEN_SUPPORTED -> op.context.#T(#T.FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED)",
77+
RuntimeTypes.SmithyClient.Config.ChecksumConfigOption,
78+
RuntimeTypes.Core.BusinessMetrics.emitBusinessMetric,
79+
RuntimeTypes.Core.BusinessMetrics.SmithyBusinessMetric,
80+
)
81+
writer.write(
82+
"#T.WHEN_REQUIRED -> op.context.#T(#T.FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED)",
83+
RuntimeTypes.SmithyClient.Config.ChecksumConfigOption,
84+
RuntimeTypes.Core.BusinessMetrics.emitBusinessMetric,
85+
RuntimeTypes.Core.BusinessMetrics.SmithyBusinessMetric,
86+
)
87+
}
88+
}
89+
}
3190

3291
private val flexibleChecksumsRequestMiddleware = object : ProtocolMiddleware {
3392
override val name: String = "FlexibleChecksumsRequest"
@@ -42,22 +101,25 @@ class FlexibleChecksumsRequest : KotlinIntegration {
42101
}
43102

44103
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
45-
val interceptorSymbol = RuntimeTypes.HttpClient.Interceptors.FlexibleChecksumsRequestInterceptor
46-
val inputSymbol = ctx.symbolProvider.toSymbol(ctx.model.expectShape(op.inputShape))
47-
48104
val httpChecksumTrait = op.getTrait<HttpChecksumTrait>()!!
49105

50106
val requestAlgorithmMember = ctx.model.expectShape<StructureShape>(op.input.get())
51107
.members()
52108
.first { it.memberName == httpChecksumTrait.requestAlgorithmMember.get() }
53109

54-
val requestAlgorithmMemberName = ctx.symbolProvider.toMemberName(requestAlgorithmMember)
110+
val userSelectedChecksumAlgorithm = ctx.symbolProvider.toMemberName(requestAlgorithmMember)
111+
val requestChecksumRequired = httpChecksumTrait.isRequestChecksumRequired
112+
val streamingPayload = operationsWithStreamingPayloads.contains(op.id)
55113

56-
writer.withBlock("op.interceptors.add(#T<#T>() {", "})", interceptorSymbol, inputSymbol) {
57-
writer.write("input.#L?.value", requestAlgorithmMemberName)
58-
}
59-
writer.withBlock("input.#L?.let {", "}", requestAlgorithmMemberName) {
60-
writer.write("op.context[#T.ChecksumAlgorithm] = it.value", RuntimeTypes.HttpClient.Operation.HttpOperationContext)
114+
writer.withBlock(
115+
"op.interceptors.add(#T(",
116+
"))",
117+
RuntimeTypes.HttpClient.Interceptors.FlexibleChecksumsRequestInterceptor,
118+
) {
119+
writer.write("requestChecksumRequired = #L,", requestChecksumRequired)
120+
writer.write("requestChecksumCalculation = config.requestChecksumCalculation,")
121+
writer.write("userSelectedChecksumAlgorithm = input.#L?.value,", userSelectedChecksumAlgorithm)
122+
writer.write("streamingPayload = #L,", streamingPayload)
61123
}
62124
}
63125
}

codegen/aws-sdk-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/customization/flexiblechecksums/FlexibleChecksumsResponse.kt

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ package aws.sdk.kotlin.codegen.customization.flexiblechecksums
66

77
import software.amazon.smithy.aws.traits.HttpChecksumTrait
88
import software.amazon.smithy.kotlin.codegen.KotlinSettings
9-
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
10-
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
11-
import software.amazon.smithy.kotlin.codegen.core.defaultName
12-
import software.amazon.smithy.kotlin.codegen.core.withBlock
9+
import software.amazon.smithy.kotlin.codegen.core.*
1310
import software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration
1411
import software.amazon.smithy.kotlin.codegen.model.*
1512
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
1613
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolMiddleware
14+
import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigProperty
15+
import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigPropertyType
1716
import software.amazon.smithy.kotlin.codegen.utils.getOrNull
1817
import software.amazon.smithy.model.Model
1918
import software.amazon.smithy.model.shapes.OperationShape
@@ -27,8 +26,41 @@ class FlexibleChecksumsResponse : KotlinIntegration {
2726
.shapes<OperationShape>()
2827
.any { it.hasTrait<HttpChecksumTrait>() }
2928

29+
override fun additionalServiceConfigProps(ctx: CodegenContext): List<ConfigProperty> =
30+
listOf(
31+
ConfigProperty {
32+
name = "responseChecksumValidation"
33+
symbol = RuntimeTypes.SmithyClient.Config.ChecksumConfigOption
34+
baseClass = RuntimeTypes.SmithyClient.Config.HttpChecksumClientConfig
35+
useNestedBuilderBaseClass()
36+
documentation = "" // todo
37+
propertyType = ConfigPropertyType.RequiredWithDefault("ChecksumConfigOption.WHEN_SUPPORTED")
38+
},
39+
)
40+
3041
override fun customizeMiddleware(ctx: ProtocolGenerator.GenerationContext, resolved: List<ProtocolMiddleware>) =
31-
resolved + flexibleChecksumsResponseMiddleware
42+
resolved + flexibleChecksumsResponseMiddleware + configBusinessMetrics
43+
44+
private val configBusinessMetrics = object : ProtocolMiddleware {
45+
override val name: String = "responseChecksumValidationBusinessMetric"
46+
47+
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
48+
writer.withBlock("when(config.responseChecksumValidation) {", "}") {
49+
writer.write(
50+
"#T.WHEN_SUPPORTED -> op.context.#T(#T.FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED)",
51+
RuntimeTypes.SmithyClient.Config.ChecksumConfigOption,
52+
RuntimeTypes.Core.BusinessMetrics.emitBusinessMetric,
53+
RuntimeTypes.Core.BusinessMetrics.SmithyBusinessMetric,
54+
)
55+
writer.write(
56+
"#T.WHEN_REQUIRED -> op.context.#T(#T.FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED)",
57+
RuntimeTypes.SmithyClient.Config.ChecksumConfigOption,
58+
RuntimeTypes.Core.BusinessMetrics.emitBusinessMetric,
59+
RuntimeTypes.Core.BusinessMetrics.SmithyBusinessMetric,
60+
)
61+
}
62+
}
63+
}
3264

3365
private val flexibleChecksumsResponseMiddleware = object : ProtocolMiddleware {
3466
override val name: String = "FlexibleChecksumsResponse"
@@ -43,21 +75,19 @@ class FlexibleChecksumsResponse : KotlinIntegration {
4375
}
4476

4577
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
46-
val inputSymbol = ctx.symbolProvider.toSymbol(ctx.model.expectShape(op.inputShape))
47-
val interceptorSymbol = RuntimeTypes.HttpClient.Interceptors.FlexibleChecksumsResponseInterceptor
48-
4978
val httpChecksumTrait = op.getTrait<HttpChecksumTrait>()!!
5079
val requestValidationModeMember = ctx.model.expectShape<StructureShape>(op.input.get())
5180
.members()
5281
.first { it.memberName == httpChecksumTrait.requestValidationModeMember.get() }
82+
val requestValidationModeMemberName = ctx.symbolProvider.toMemberName(requestValidationModeMember)
5383

5484
writer.withBlock(
55-
"op.interceptors.add(#T<#T> {",
56-
"})",
57-
interceptorSymbol,
58-
inputSymbol,
85+
"op.interceptors.add(#T(",
86+
"))",
87+
RuntimeTypes.HttpClient.Interceptors.FlexibleChecksumsResponseInterceptor,
5988
) {
60-
writer.write("it.#L?.value == \"ENABLED\"", requestValidationModeMember.defaultName())
89+
writer.write("responseValidation = input.#L?.value == \"ENABLED\",", requestValidationModeMemberName)
90+
writer.write("responseChecksumValidation = config.responseChecksumValidation,")
6191
}
6292
}
6393
}

0 commit comments

Comments
 (0)