@@ -18,9 +18,11 @@ import software.amazon.smithy.kotlin.codegen.model.buildSymbol
1818import software.amazon.smithy.kotlin.codegen.model.hasTrait
1919import software.amazon.smithy.kotlin.codegen.model.knowledge.AwsSignatureVersion4
2020import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
21+ import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolMiddleware
2122import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigProperty
2223import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigPropertyType
2324import software.amazon.smithy.model.Model
25+ import software.amazon.smithy.model.knowledge.EventStreamIndex
2426import software.amazon.smithy.model.shapes.OperationShape
2527import software.amazon.smithy.model.shapes.ShapeId
2628
@@ -36,6 +38,11 @@ class Sigv4AuthSchemeIntegration : KotlinIntegration {
3638
3739 override fun authSchemes (ctx : ProtocolGenerator .GenerationContext ): List <AuthSchemeHandler > = listOf (SigV4AuthSchemeHandler ())
3840
41+ override fun customizeMiddleware (
42+ ctx : ProtocolGenerator .GenerationContext ,
43+ resolved : List <ProtocolMiddleware >,
44+ ): List <ProtocolMiddleware > = resolved + Sigv4SignedBodyHeaderMiddleware ()
45+
3946 override fun additionalServiceConfigProps (ctx : CodegenContext ): List <ConfigProperty > {
4047 val credentialsProviderProp = ConfigProperty {
4148 symbol = RuntimeTypes .Auth .Credentials .AwsCredentials .CredentialsProvider
@@ -87,3 +94,23 @@ open class SigV4AuthSchemeHandler : AuthSchemeHandler {
8794 writer.write(" #T(#T, #S)" , RuntimeTypes .Auth .HttpAuthAws .SigV4AuthScheme , RuntimeTypes .Auth .Signing .AwsSigningStandard .DefaultAwsSigner , signingService)
8895 }
8996}
97+
98+ /* *
99+ * Conditionally updates the operation context to set the signed body header attribute
100+ * e.g. to set `X-Amz-Content-Sha256` header.
101+ */
102+ class Sigv4SignedBodyHeaderMiddleware : ProtocolMiddleware {
103+ override val name: String = " Sigv4SignedBodyHeaderMiddleware"
104+
105+ override fun isEnabledFor (ctx : ProtocolGenerator .GenerationContext , op : OperationShape ): Boolean {
106+ val hasEventStream = EventStreamIndex .of(ctx.model).getInputInfo(op).isPresent
107+ return hasEventStream || op.hasTrait<UnsignedPayloadTrait >()
108+ }
109+ override fun render (ctx : ProtocolGenerator .GenerationContext , op : OperationShape , writer : KotlinWriter ) {
110+ writer.write(
111+ " op.context.set(#T.SignedBodyHeader, #T.X_AMZ_CONTENT_SHA256)" ,
112+ RuntimeTypes .Auth .Signing .AwsSigningCommon .AwsSigningAttributes ,
113+ RuntimeTypes .Auth .Signing .AwsSigningCommon .AwsSignedBodyHeader ,
114+ )
115+ }
116+ }
0 commit comments