@@ -15,15 +15,14 @@ import aws.sdk.kotlin.codegen.protocols.middleware.UserAgentMiddleware
1515import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestErrorGenerator
1616import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestRequestGenerator
1717import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestResponseGenerator
18+ import software.amazon.smithy.aws.traits.protocols.AwsQueryCompatibleTrait
1819import software.amazon.smithy.codegen.core.CodegenException
1920import software.amazon.smithy.codegen.core.Symbol
20- import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
21- import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
22- import software.amazon.smithy.kotlin.codegen.core.useFileWriter
23- import software.amazon.smithy.kotlin.codegen.core.withBlock
21+ import software.amazon.smithy.kotlin.codegen.core.*
2422import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
2523import software.amazon.smithy.kotlin.codegen.model.buildSymbol
2624import software.amazon.smithy.kotlin.codegen.model.getEndpointRules
25+ import software.amazon.smithy.kotlin.codegen.model.hasTrait
2726import software.amazon.smithy.kotlin.codegen.model.namespace
2827import software.amazon.smithy.kotlin.codegen.rendering.ExceptionBaseClassGenerator
2928import software.amazon.smithy.kotlin.codegen.rendering.endpoints.*
@@ -140,6 +139,20 @@ abstract class AwsHttpBindingProtocolGenerator : HttpBindingProtocolGenerator()
140139 }
141140 .write(" " )
142141
142+ if (ctx.service.hasTrait<AwsQueryCompatibleTrait >()) {
143+ writer.write(" var queryErrorDetails: #T? = null" , RuntimeTypes .AwsProtocolCore .AwsQueryCompatibleErrorDetails )
144+ writer.withBlock(" response.headers[#T]?.let {" , " }" , RuntimeTypes .AwsProtocolCore .XAmznQueryErrorHeader ) {
145+ openBlock(" queryErrorDetails = try {" )
146+ write(" #T.parse(it)" , RuntimeTypes .AwsProtocolCore .AwsQueryCompatibleErrorDetails )
147+ closeAndOpenBlock(" } catch (ex: Exception) {" )
148+ withBlock(""" throw #T("Failed to parse awsQuery-compatible error", ex).also {""" , " }" , exceptionBaseSymbol) {
149+ write(" #T(it, wrappedResponse, errorDetails)" , RuntimeTypes .AwsProtocolCore .setAseErrorMetadata)
150+ }
151+ closeBlock(" }" )
152+ }
153+ writer.write(" " )
154+ }
155+
143156 writer.withBlock(" val ex = when(errorDetails.code) {" , " }" ) {
144157 op.errors.forEach { err ->
145158 val errSymbol = ctx.symbolProvider.toSymbol(ctx.model.expectShape(err))
@@ -154,6 +167,10 @@ abstract class AwsHttpBindingProtocolGenerator : HttpBindingProtocolGenerator()
154167
155168 writer.write(" " )
156169 writer.write(" #T(ex, wrappedResponse, errorDetails)" , RuntimeTypes .AwsProtocolCore .setAseErrorMetadata)
170+ if (ctx.service.hasTrait<AwsQueryCompatibleTrait >()) {
171+ writer.write(" queryErrorDetails?.let { #T(ex, it) }" , RuntimeTypes .AwsProtocolCore .setAwsQueryCompatibleErrorMetadata)
172+ }
173+
157174 writer.write(" throw ex" )
158175 }
159176
0 commit comments