@@ -39,6 +39,7 @@ import java.util.*
3939 */
4040class SigV4AuthSchemeIntegration : KotlinIntegration {
4141 // Allow integrations to customize the service config props, later integrations take precedence
42+ // Needs to happen after the `SigV4AsymmetricTraitCustomization` (-60).
4243 override val order: Byte = - 50
4344
4445 override fun enabledForService (model : Model , settings : KotlinSettings ): Boolean =
@@ -51,22 +52,7 @@ class SigV4AuthSchemeIntegration : KotlinIntegration {
5152 resolved : List <ProtocolMiddleware >,
5253 ): List <ProtocolMiddleware > = resolved + Sigv4SignedBodyHeaderMiddleware ()
5354
54- override fun additionalServiceConfigProps (ctx : CodegenContext ): List <ConfigProperty > {
55- val credentialsProviderProp = ConfigProperty {
56- symbol = RuntimeTypes .Auth .Credentials .AwsCredentials .CredentialsProvider
57- baseClass = RuntimeTypes .Auth .Credentials .AwsCredentials .CredentialsProviderConfig
58- useNestedBuilderBaseClass()
59- documentation = """
60- The AWS credentials provider to use for authenticating requests.
61- NOTE: The caller is responsible for managing the lifetime of the provider when set. The SDK
62- client will not close it when the client is closed.
63- """ .trimIndent()
64-
65- propertyType = ConfigPropertyType .Required ()
66- }
67-
68- return listOf (credentialsProviderProp)
69- }
55+ override fun additionalServiceConfigProps (ctx : CodegenContext ): List <ConfigProperty > = listOf (credentialsProviderProp)
7056
7157 override fun customizeEndpointResolution (ctx : ProtocolGenerator .GenerationContext ): EndpointCustomization =
7258 Sigv4EndpointCustomization
@@ -174,13 +160,14 @@ open class SigV4AuthSchemeHandler : AuthSchemeHandler {
174160 * Conditionally updates the operation context to set the signed body header attribute
175161 * e.g. to set `X-Amz-Content-Sha256` header.
176162 */
177- class Sigv4SignedBodyHeaderMiddleware : ProtocolMiddleware {
163+ internal class Sigv4SignedBodyHeaderMiddleware : ProtocolMiddleware {
178164 override val name: String = " Sigv4SignedBodyHeaderMiddleware"
179165
180166 override fun isEnabledFor (ctx : ProtocolGenerator .GenerationContext , op : OperationShape ): Boolean {
181167 val hasEventStream = EventStreamIndex .of(ctx.model).getInputInfo(op).isPresent
182168 return hasEventStream || op.hasTrait<UnsignedPayloadTrait >()
183169 }
170+
184171 override fun render (ctx : ProtocolGenerator .GenerationContext , op : OperationShape , writer : KotlinWriter ) {
185172 writer.write(
186173 " op.context.set(#T.SignedBodyHeader, #T.X_AMZ_CONTENT_SHA256)" ,
@@ -196,20 +183,20 @@ private object Sigv4EndpointCustomization : EndpointCustomization {
196183 )
197184}
198185
199- private fun String.toAuthOptionFactoryFn (): Symbol ? =
200- when (this ) {
201- " sigv4" -> RuntimeTypes .Auth .HttpAuthAws .sigV4
202- " sigv4a" -> RuntimeTypes .Auth .HttpAuthAws .sigV4A
203- else -> null
204- }
205-
186+ // SigV4a requires SigV4 so SigV4 integration renders SigV4a auth scheme.
187+ // See comment in example model: https://smithy.io/2.0/aws/aws-auth.html?highlight=sigv4#aws-auth-sigv4a-trait
206188private fun renderAuthSchemes (writer : KotlinWriter , authSchemes : Expression , expressionRenderer : ExpressionRenderer ) {
207189 writer.writeInline(" #T to " , RuntimeTypes .SmithyClient .Endpoints .SigningContextAttributeKey )
208190 writer.withBlock(" listOf(" , " )" ) {
209191 authSchemes.toNode().expectArrayNode().forEach {
210192 val scheme = it.expectObjectNode()
211193 val schemeName = scheme.expectStringMember(" name" ).value
212- val authFactoryFn = schemeName.toAuthOptionFactoryFn() ? : return @forEach
194+
195+ val authFactoryFn = when (schemeName) {
196+ " sigv4" -> RuntimeTypes .Auth .HttpAuthAws .sigV4
197+ " sigv4a" -> RuntimeTypes .Auth .HttpAuthAws .sigV4A
198+ else -> return @forEach
199+ }
213200
214201 withBlock(" #T(" , " )," , authFactoryFn) {
215202 // we delegate back to the expression visitor for each of these fields because it's possible to
@@ -221,15 +208,30 @@ private fun renderAuthSchemes(writer: KotlinWriter, authSchemes: Expression, exp
221208 writeInline(" disableDoubleUriEncode = " )
222209 renderOrElse(expressionRenderer, scheme.getBooleanMember(" disableDoubleEncoding" ), " false" )
223210
224- when (schemeName) {
225- " sigv4" -> renderSigV4Fields(writer, scheme, expressionRenderer)
226- " sigv4a" -> renderSigV4AFields(writer, scheme, expressionRenderer)
227- }
211+ renderFieldsForScheme(writer, scheme, expressionRenderer)
228212 }
229213 }
230214 }
231215}
232216
217+ private fun renderFieldsForScheme (writer : KotlinWriter , scheme : ObjectNode , expressionRenderer : ExpressionRenderer ) {
218+ when (scheme.expectStringMember(" name" ).value) {
219+ " sigv4" -> renderSigV4Fields(writer, scheme, expressionRenderer)
220+ " sigv4a" -> renderSigV4AFields(writer, scheme, expressionRenderer)
221+ }
222+ }
223+
224+ private fun renderSigV4Fields (writer : KotlinWriter , scheme : ObjectNode , expressionRenderer : ExpressionRenderer ) {
225+ writer.writeInline(" signingRegion = " )
226+ writer.renderOrElse(expressionRenderer, scheme.getStringMember(" signingRegion" ), " null" )
227+ }
228+
229+ private fun renderSigV4AFields (writer : KotlinWriter , scheme : ObjectNode , expressionRenderer : ExpressionRenderer ) {
230+ writer.writeInline(" signingRegionSet = " )
231+ expressionRenderer.renderExpression(Expression .fromNode(scheme.expectArrayMember(" signingRegionSet" )))
232+ writer.write(" ," )
233+ }
234+
233235private fun KotlinWriter.renderOrElse (
234236 expressionRenderer : ExpressionRenderer ,
235237 optionalNode : Optional <out Node >,
@@ -243,13 +245,15 @@ private fun KotlinWriter.renderOrElse(
243245 write(" ," )
244246}
245247
246- private fun renderSigV4Fields (writer : KotlinWriter , scheme : ObjectNode , expressionRenderer : ExpressionRenderer ) {
247- writer.writeInline(" signingRegion = " )
248- writer.renderOrElse(expressionRenderer, scheme.getStringMember(" signingRegion" ), " null" )
249- }
248+ internal val credentialsProviderProp = ConfigProperty {
249+ symbol = RuntimeTypes .Auth .Credentials .AwsCredentials .CredentialsProvider
250+ baseClass = RuntimeTypes .Auth .Credentials .AwsCredentials .CredentialsProviderConfig
251+ useNestedBuilderBaseClass()
252+ documentation = """
253+ The AWS credentials provider to use for authenticating requests.
254+ NOTE: The caller is responsible for managing the lifetime of the provider when set. The SDK
255+ client will not close it when the client is closed.
256+ """ .trimIndent()
250257
251- private fun renderSigV4AFields (writer : KotlinWriter , scheme : ObjectNode , expressionRenderer : ExpressionRenderer ) {
252- writer.writeInline(" signingRegionSet = " )
253- expressionRenderer.renderExpression(Expression .fromNode(scheme.expectArrayMember(" signingRegionSet" )))
254- writer.write(" ," )
258+ propertyType = ConfigPropertyType .Required ()
255259}
0 commit comments