Skip to content

Commit 41ad742

Browse files
committed
Fix composite checksums
1 parent 427daf3 commit 41ad742

File tree

10 files changed

+45
-102
lines changed

10 files changed

+45
-102
lines changed

aws-runtime/aws-http/common/src/aws/sdk/kotlin/runtime/http/interceptors/S3CompositeChecksumsInterceptor.kt

Lines changed: 0 additions & 47 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package aws.sdk.kotlin.runtime.http.interceptors
2+
3+
import aws.smithy.kotlin.runtime.client.config.HttpChecksumConfigOption
4+
import aws.smithy.kotlin.runtime.http.interceptors.FlexibleChecksumsResponseInterceptor
5+
6+
/**
7+
* S3 variant of the flexible checksum interceptor where composite checksums are not validated
8+
*/
9+
public class S3FlexibleChecksumResponseInterceptor(
10+
responseValidationRequired: Boolean,
11+
responseChecksumValidation: HttpChecksumConfigOption?,
12+
) : FlexibleChecksumsResponseInterceptor(
13+
responseValidationRequired,
14+
responseChecksumValidation,
15+
) {
16+
override fun ignoreChecksum(checksum: String): Boolean =
17+
checksum.isCompositeChecksum()
18+
}
19+
20+
/**
21+
* Verifies if a checksum is composite.
22+
*/
23+
private fun String.isCompositeChecksum(): Boolean {
24+
// Ends with "-#" where "#" is a number
25+
val regex = Regex("-(\\d)+$")
26+
return regex.containsMatchIn(this)
27+
}

codegen/aws-sdk-codegen/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ dependencies {
3030
api(libs.smithy.protocol.test.traits)
3131
implementation(libs.smithy.aws.endpoints)
3232
implementation(libs.smithy.smoke.test.traits)
33+
implementation(libs.smithy.kotlin.runtime.core)
3334

3435
testImplementation(libs.junit.jupiter)
3536
testImplementation(libs.junit.jupiter.params)

codegen/aws-sdk-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/AwsRuntimeTypes.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ object AwsRuntimeTypes {
6262
val UnsupportedSigningAlgorithmInterceptor = symbol("UnsupportedSigningAlgorithmInterceptor")
6363
val BusinessMetricsInterceptor = symbol("BusinessMetricsInterceptor")
6464
val AwsBusinessMetric = symbol("AwsBusinessMetric")
65-
val S3CompositeChecksumsInterceptor = symbol("S3CompositeChecksumsInterceptor")
65+
val S3FlexibleChecksumResponseInterceptor = symbol("S3FlexibleChecksumResponseInterceptor")
6666
}
6767

6868
object Retries {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package aws.sdk.kotlin.codegen
66

77
import aws.sdk.kotlin.codegen.model.traits.Presignable
8+
import aws.smithy.kotlin.runtime.hashing.algorithmsSupportedForFlexibleChecksums
89
import software.amazon.smithy.aws.traits.HttpChecksumTrait
910
import software.amazon.smithy.aws.traits.auth.SigV4Trait
1011
import software.amazon.smithy.aws.traits.protocols.AwsQueryTrait
@@ -304,7 +305,7 @@ class PresignerGenerator : KotlinIntegration {
304305
coroutineContext,
305306
warn,
306307
"The requested checksum algorithm (\${checksumAlgorithmName}) is not supported for pre-signed URL checksums, sending request without checksum. " +
307-
"Supported checksums for pre-signed URLs include the following: ",
308+
"Supported checksums for pre-signed URLs: $algorithmsSupportedForFlexibleChecksums",
308309
)
309310
}
310311
}

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package aws.sdk.kotlin.codegen.customization.flexiblechecksums
66

7+
import aws.sdk.kotlin.codegen.AwsRuntimeTypes
8+
import aws.sdk.kotlin.codegen.customization.s3.isS3
79
import software.amazon.smithy.aws.traits.HttpChecksumTrait
810
import software.amazon.smithy.kotlin.codegen.KotlinSettings
911
import software.amazon.smithy.kotlin.codegen.core.*
@@ -16,6 +18,7 @@ import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigPropertyType
1618
import software.amazon.smithy.kotlin.codegen.utils.getOrNull
1719
import software.amazon.smithy.model.Model
1820
import software.amazon.smithy.model.shapes.OperationShape
21+
import software.amazon.smithy.model.shapes.ServiceShape
1922
import software.amazon.smithy.model.shapes.StructureShape
2023

2124
/**
@@ -84,18 +87,22 @@ private val flexibleChecksumsResponseMiddleware = object : ProtocolMiddleware {
8487
}
8588

8689
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
87-
val inputSymbol = ctx.symbolProvider.toSymbol(ctx.model.expectShape(op.inputShape))
8890
val httpChecksumTrait = op.getTrait<HttpChecksumTrait>()!!
8991
val requestValidationModeMember = ctx.model.expectShape<StructureShape>(op.input.get())
9092
.members()
9193
.first { it.memberName == httpChecksumTrait.requestValidationModeMember.get() }
9294
val requestValidationModeMemberName = ctx.symbolProvider.toMemberName(requestValidationModeMember)
9395

94-
writer.withBlock( // TODO: ADD DIFFERENT INTERCEPTORS DEPENDING ON IF THE SERVICE HAS COMPOSITE CHECKSUMS !
95-
"op.interceptors.add(#T<#T>(",
96+
val interceptor = if (ctx.model.expectShape<ServiceShape>(ctx.settings.service).isS3) {
97+
AwsRuntimeTypes.Http.Interceptors.S3FlexibleChecksumResponseInterceptor
98+
} else {
99+
RuntimeTypes.HttpClient.Interceptors.FlexibleChecksumsResponseInterceptor
100+
}
101+
102+
writer.withBlock(
103+
"op.interceptors.add(#T(",
96104
"))",
97-
RuntimeTypes.HttpClient.Interceptors.FlexibleChecksumsResponseInterceptor,
98-
inputSymbol,
105+
interceptor,
99106
) {
100107
writer.write("input.#L?.value == \"ENABLED\",", requestValidationModeMemberName)
101108
writer.write("config.responseChecksumValidation,")

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

Lines changed: 0 additions & 44 deletions
This file was deleted.

codegen/aws-sdk-codegen/src/main/resources/META-INF/services/software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ aws.sdk.kotlin.codegen.endpoints.AddAwsEndpointFunctions
1212
aws.sdk.kotlin.codegen.PresignerGenerator
1313
aws.sdk.kotlin.codegen.customization.flexiblechecksums.FlexibleChecksumsRequest
1414
aws.sdk.kotlin.codegen.customization.flexiblechecksums.FlexibleChecksumsResponse
15-
aws.sdk.kotlin.codegen.customization.flexiblechecksums.s3.S3CompositeChecksumsIntegration
1615
aws.sdk.kotlin.codegen.customization.AddAwsSpanAttributes
1716
aws.sdk.kotlin.codegen.customization.s3.S3OperationErrorHandler
1817
aws.sdk.kotlin.codegen.customization.s3.S3SigningConfig

services/s3/e2eTest/src/S3ChecksumTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ class S3ChecksumTest {
169169
val unsignedPutRequest = PutObjectRequest {
170170
bucket = testBucket
171171
key = testKey()
172-
checksumCrc32 = "`"
173172
}
174173
val presignedPutRequest = client.presignPutObject(unsignedPutRequest, 60.seconds)
175174
val contents = "presign-test"

tests/codegen/event-stream/src/commonTest/resources/event-stream-model-template.smithy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ use aws.protocols#restJson1
44
use aws.api#service
55
use aws.auth#sigv4
66

7-
@restJson1
7+
@{protocol-name}
88
@sigv4(name: "event-stream-test")
99
@service(sdkId: "EventStreamTest")
1010
service TestService { version: "123", operations: [TestStreamOp] }
1111

12-
@http(method: "POST", uri: "/test-eventstream", code: 200)
12+
{op-traits}
1313
operation TestStreamOp {
1414
input: TestStreamInputOutput,
1515
output: TestStreamInputOutput,

0 commit comments

Comments
 (0)