Skip to content

Commit a859c7a

Browse files
authored
feat: add support for awsQuery-compatible error responses (#880)
1 parent e1e8c2e commit a859c7a

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "47db33ac-96a0-4258-b05e-7245fff5ea79",
3+
"type": "feature",
4+
"description": "Add support for awsQuery-compatible error responses."
5+
}

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/core/AwsHttpBindingProtocolGenerator.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@ import aws.sdk.kotlin.codegen.protocols.middleware.UserAgentMiddleware
1515
import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestErrorGenerator
1616
import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestRequestGenerator
1717
import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestResponseGenerator
18+
import software.amazon.smithy.aws.traits.protocols.AwsQueryCompatibleTrait
1819
import software.amazon.smithy.codegen.core.CodegenException
1920
import 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.*
2422
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
2523
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
2624
import software.amazon.smithy.kotlin.codegen.model.getEndpointRules
25+
import software.amazon.smithy.kotlin.codegen.model.hasTrait
2726
import software.amazon.smithy.kotlin.codegen.model.namespace
2827
import software.amazon.smithy.kotlin.codegen.rendering.ExceptionBaseClassGenerator
2928
import 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

Comments
 (0)