From 91478be9dc1c88219dd8cf5564af98b574f6189f Mon Sep 17 00:00:00 2001 From: Ken Gilmer Date: Wed, 28 Apr 2021 20:58:23 -0700 Subject: [PATCH 1/4] fix error registration codegen to generate without presense of HttpErrorTrait --- .../protocols/json/RestJsonErrorMiddleware.kt | 9 ++- .../protocols/xml/RestXmlErrorMiddleware.kt | 7 +- .../json/AwsJsonErrorMiddlewareTest.kt | 74 +++++++++++++++++++ .../xml/RestXmlErrorMiddlewareTest.kt | 74 +++++++++++++++++++ 4 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt create mode 100644 codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt diff --git a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt index b828a2cfbec..e5d46f857a8 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt @@ -9,6 +9,7 @@ import aws.sdk.kotlin.codegen.AwsKotlinDependency import aws.sdk.kotlin.codegen.protocols.middleware.ModeledExceptionsMiddleware import software.amazon.smithy.kotlin.codegen.core.KotlinWriter import software.amazon.smithy.kotlin.codegen.core.addImport +import software.amazon.smithy.kotlin.codegen.model.getTrait import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpBindingResolver import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator import software.amazon.smithy.model.traits.HttpErrorTrait @@ -31,10 +32,10 @@ class RestJsonErrorMiddleware( val code = errShape.id.name val symbol = ctx.symbolProvider.toSymbol(errShape) val deserializerName = "${symbol.name}Deserializer" - val httpStatusCode: Int? = errShape.getTrait(HttpErrorTrait::class.java).map { it.code }.orElse(null) - if (httpStatusCode != null) { - writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) - } + // If model specifies error code use it otherwise default to 400. + // See https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httperror-trait + val httpStatusCode = errShape.getTrait()?.code ?: 400 + writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) } } } diff --git a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt index d11cb274b7e..aa975bf2f1b 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt @@ -32,9 +32,10 @@ class RestXmlErrorMiddleware( val code = errShape.id.name val symbol = ctx.symbolProvider.toSymbol(errShape) val deserializerName = "${symbol.name}Deserializer" - errShape.getTrait()?.code?.let { httpStatusCode -> - writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) - } + // If model specifies error code use it otherwise default to 400. + // See https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httperror-trait + val httpStatusCode = errShape.getTrait()?.code ?: 400 + writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) } } } diff --git a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt new file mode 100644 index 00000000000..2dd0061d07e --- /dev/null +++ b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt @@ -0,0 +1,74 @@ +package aws.sdk.kotlin.codegen.protocols.json + +import org.junit.jupiter.api.Test +import software.amazon.smithy.kotlin.codegen.core.KotlinWriter +import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpTraitResolver +import software.amazon.smithy.kotlin.codegen.test.* + +class AwsJsonErrorMiddlewareTest { + + @Test + fun `it registers error deserializers for error shapes`() { + val model = """ + @http(method: "PUT", uri: "/test", code: 200) + operation TestOperation { + output: TestResponse, + errors: [TestError] + } + + structure TestResponse { + someVal: Integer + } + + @error("client") + structure TestError { + someCode: Integer, + someMessage: String + } + """.prependNamespaceAndService(operations = listOf("TestOperation")) + .toSmithyModel() + + val (ctx, _, _) = model.newTestContext() + + val unit = RestJsonErrorMiddleware(ctx, AwsJsonHttpBindingResolver(ctx, "application/x-amz-json-1.0")) + + val actual = generateCode { writer -> + unit.renderRegisterErrors(writer) + } + + actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 400)") + } + + @Test + fun `it registers error deserializer with custom code for error shapes`() { + val model = """ + @http(method: "PUT", uri: "/test", code: 200) + operation TestOperation { + output: TestResponse, + errors: [TestError] + } + + structure TestResponse { + someVal: Integer + } + + @error("client") + @httpError(404) + structure TestError { + someCode: Integer, + someMessage: String + } + """.prependNamespaceAndService(operations = listOf("TestOperation")) + .toSmithyModel() + + val (ctx, _, _) = model.newTestContext() + + val unit = RestJsonErrorMiddleware(ctx, HttpTraitResolver(ctx, "application/xml")) + + val actual = generateCode { writer -> + unit.renderRegisterErrors(writer) + } + + actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 404)") + } +} \ No newline at end of file diff --git a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt new file mode 100644 index 00000000000..42f22998626 --- /dev/null +++ b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt @@ -0,0 +1,74 @@ +package aws.sdk.kotlin.codegen.protocols.xml + +import org.junit.jupiter.api.Test +import software.amazon.smithy.kotlin.codegen.core.KotlinWriter +import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpTraitResolver +import software.amazon.smithy.kotlin.codegen.test.* + +class RestXmlErrorMiddlewareTest { + + @Test + fun `it registers error deserializers for error shapes`() { + val model = """ + @http(method: "PUT", uri: "/test", code: 200) + operation TestOperation { + output: TestResponse, + errors: [TestError] + } + + structure TestResponse { + someVal: Integer + } + + @error("client") + structure TestError { + someCode: Integer, + someMessage: String + } + """.prependNamespaceAndService(operations = listOf("TestOperation")) + .toSmithyModel() + + val (ctx, _, _) = model.newTestContext() + + val unit = RestXmlErrorMiddleware(ctx, HttpTraitResolver(ctx, "application/xml")) + + val actual = generateCode { writer -> + unit.renderRegisterErrors(writer) + } + + actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 400)") + } + + @Test + fun `it registers error deserializer with custom code for error shapes`() { + val model = """ + @http(method: "PUT", uri: "/test", code: 200) + operation TestOperation { + output: TestResponse, + errors: [TestError] + } + + structure TestResponse { + someVal: Integer + } + + @error("client") + @httpError(404) + structure TestError { + someCode: Integer, + someMessage: String + } + """.prependNamespaceAndService(operations = listOf("TestOperation")) + .toSmithyModel() + + val (ctx, _, _) = model.newTestContext() + + val unit = RestXmlErrorMiddleware(ctx, HttpTraitResolver(ctx, "application/xml")) + + val actual = generateCode { writer -> + unit.renderRegisterErrors(writer) + } + + actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 404)") + } +} \ No newline at end of file From cce946252a5262fc1653e4f84b5a59b27356bdfe Mon Sep 17 00:00:00 2001 From: Ken Gilmer Date: Thu, 29 Apr 2021 07:53:36 -0700 Subject: [PATCH 2/4] linter --- .../codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt | 3 +-- .../kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt index 2dd0061d07e..f6ed551c982 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt @@ -1,7 +1,6 @@ package aws.sdk.kotlin.codegen.protocols.json import org.junit.jupiter.api.Test -import software.amazon.smithy.kotlin.codegen.core.KotlinWriter import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpTraitResolver import software.amazon.smithy.kotlin.codegen.test.* @@ -71,4 +70,4 @@ class AwsJsonErrorMiddlewareTest { actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 404)") } -} \ No newline at end of file +} diff --git a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt index 42f22998626..32bf940c453 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt @@ -1,7 +1,6 @@ package aws.sdk.kotlin.codegen.protocols.xml import org.junit.jupiter.api.Test -import software.amazon.smithy.kotlin.codegen.core.KotlinWriter import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpTraitResolver import software.amazon.smithy.kotlin.codegen.test.* @@ -71,4 +70,4 @@ class RestXmlErrorMiddlewareTest { actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 404)") } -} \ No newline at end of file +} From a596af35be5da8e32b0db1dc45480de0512081ae Mon Sep 17 00:00:00 2001 From: Ken Gilmer Date: Thu, 29 Apr 2021 08:19:15 -0700 Subject: [PATCH 3/4] Fix server error handling of error registration from PR feedback --- .../protocols/json/RestJsonErrorMiddleware.kt | 4 ++- .../protocols/xml/RestXmlErrorMiddleware.kt | 4 ++- .../json/AwsJsonErrorMiddlewareTest.kt | 34 ++++++++++++++++++- .../xml/RestXmlErrorMiddlewareTest.kt | 34 ++++++++++++++++++- 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt index e5d46f857a8..c855c7665d9 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.kotlin.codegen.core.addImport import software.amazon.smithy.kotlin.codegen.model.getTrait import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpBindingResolver import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator +import software.amazon.smithy.model.traits.ErrorTrait import software.amazon.smithy.model.traits.HttpErrorTrait class RestJsonErrorMiddleware( @@ -34,7 +35,8 @@ class RestJsonErrorMiddleware( val deserializerName = "${symbol.name}Deserializer" // If model specifies error code use it otherwise default to 400. // See https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httperror-trait - val httpStatusCode = errShape.getTrait()?.code ?: 400 + val defaultCode = if (errShape.getTrait()?.isClientError ?: error("Expected Error trait on shape $errShape")) 400 else 500 + val httpStatusCode = errShape.getTrait()?.code ?: defaultCode writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) } } diff --git a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt index aa975bf2f1b..0f3ad0aff69 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.kotlin.codegen.core.addImport import software.amazon.smithy.kotlin.codegen.model.getTrait import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpBindingResolver import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator +import software.amazon.smithy.model.traits.ErrorTrait import software.amazon.smithy.model.traits.HttpErrorTrait class RestXmlErrorMiddleware( @@ -34,7 +35,8 @@ class RestXmlErrorMiddleware( val deserializerName = "${symbol.name}Deserializer" // If model specifies error code use it otherwise default to 400. // See https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httperror-trait - val httpStatusCode = errShape.getTrait()?.code ?: 400 + val defaultCode = if (errShape.getTrait()?.isClientError ?: error("Expected Error trait on shape $errShape")) 400 else 500 + val httpStatusCode = errShape.getTrait()?.code ?: defaultCode writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) } } diff --git a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt index f6ed551c982..acedc648bc1 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/json/AwsJsonErrorMiddlewareTest.kt @@ -7,7 +7,7 @@ import software.amazon.smithy.kotlin.codegen.test.* class AwsJsonErrorMiddlewareTest { @Test - fun `it registers error deserializers for error shapes`() { + fun `it registers error deserializers for client error shapes`() { val model = """ @http(method: "PUT", uri: "/test", code: 200) operation TestOperation { @@ -38,6 +38,38 @@ class AwsJsonErrorMiddlewareTest { actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 400)") } + @Test + fun `it registers error deserializers for server error shapes`() { + val model = """ + @http(method: "PUT", uri: "/test", code: 200) + operation TestOperation { + output: TestResponse, + errors: [TestError] + } + + structure TestResponse { + someVal: Integer + } + + @error("server") + structure TestError { + someCode: Integer, + someMessage: String + } + """.prependNamespaceAndService(operations = listOf("TestOperation")) + .toSmithyModel() + + val (ctx, _, _) = model.newTestContext() + + val unit = RestJsonErrorMiddleware(ctx, AwsJsonHttpBindingResolver(ctx, "application/x-amz-json-1.0")) + + val actual = generateCode { writer -> + unit.renderRegisterErrors(writer) + } + + actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 500)") + } + @Test fun `it registers error deserializer with custom code for error shapes`() { val model = """ diff --git a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt index 32bf940c453..553f31693b8 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/test/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddlewareTest.kt @@ -7,7 +7,7 @@ import software.amazon.smithy.kotlin.codegen.test.* class RestXmlErrorMiddlewareTest { @Test - fun `it registers error deserializers for error shapes`() { + fun `it registers error deserializers for client error shapes`() { val model = """ @http(method: "PUT", uri: "/test", code: 200) operation TestOperation { @@ -38,6 +38,38 @@ class RestXmlErrorMiddlewareTest { actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 400)") } + @Test + fun `it registers error deserializers for server error shapes`() { + val model = """ + @http(method: "PUT", uri: "/test", code: 200) + operation TestOperation { + output: TestResponse, + errors: [TestError] + } + + structure TestResponse { + someVal: Integer + } + + @error("server") + structure TestError { + someCode: Integer, + someMessage: String + } + """.prependNamespaceAndService(operations = listOf("TestOperation")) + .toSmithyModel() + + val (ctx, _, _) = model.newTestContext() + + val unit = RestXmlErrorMiddleware(ctx, HttpTraitResolver(ctx, "application/xml")) + + val actual = generateCode { writer -> + unit.renderRegisterErrors(writer) + } + + actual.shouldContainOnlyOnceWithDiff("register(code = \"TestError\", deserializer = TestErrorDeserializer(), httpStatusCode = 500)") + } + @Test fun `it registers error deserializer with custom code for error shapes`() { val model = """ From 1e8ed7031f89108223a4bb0bc495f15b3ea083ff Mon Sep 17 00:00:00 2001 From: Ken Gilmer Date: Mon, 3 May 2021 09:55:04 -0700 Subject: [PATCH 4/4] Updates from PR feedback --- .../kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt | 5 +++-- .../kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt index c855c7665d9..ffe77ae306c 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/json/RestJsonErrorMiddleware.kt @@ -9,6 +9,7 @@ import aws.sdk.kotlin.codegen.AwsKotlinDependency import aws.sdk.kotlin.codegen.protocols.middleware.ModeledExceptionsMiddleware import software.amazon.smithy.kotlin.codegen.core.KotlinWriter import software.amazon.smithy.kotlin.codegen.core.addImport +import software.amazon.smithy.kotlin.codegen.model.expectTrait import software.amazon.smithy.kotlin.codegen.model.getTrait import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpBindingResolver import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator @@ -33,9 +34,9 @@ class RestJsonErrorMiddleware( val code = errShape.id.name val symbol = ctx.symbolProvider.toSymbol(errShape) val deserializerName = "${symbol.name}Deserializer" - // If model specifies error code use it otherwise default to 400. + // If model specifies error code use it otherwise default to 400 (client) or 500 (server) // See https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httperror-trait - val defaultCode = if (errShape.getTrait()?.isClientError ?: error("Expected Error trait on shape $errShape")) 400 else 500 + val defaultCode = if (errShape.expectTrait().isClientError) 400 else 500 val httpStatusCode = errShape.getTrait()?.code ?: defaultCode writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) } diff --git a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt index 0f3ad0aff69..a2f15287252 100644 --- a/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt +++ b/codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/xml/RestXmlErrorMiddleware.kt @@ -9,6 +9,7 @@ import aws.sdk.kotlin.codegen.AwsKotlinDependency import aws.sdk.kotlin.codegen.protocols.middleware.ModeledExceptionsMiddleware import software.amazon.smithy.kotlin.codegen.core.KotlinWriter import software.amazon.smithy.kotlin.codegen.core.addImport +import software.amazon.smithy.kotlin.codegen.model.expectTrait import software.amazon.smithy.kotlin.codegen.model.getTrait import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpBindingResolver import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator @@ -33,9 +34,9 @@ class RestXmlErrorMiddleware( val code = errShape.id.name val symbol = ctx.symbolProvider.toSymbol(errShape) val deserializerName = "${symbol.name}Deserializer" - // If model specifies error code use it otherwise default to 400. + // If model specifies error code use it otherwise default to 400 (client) or 500 (server) // See https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httperror-trait - val defaultCode = if (errShape.getTrait()?.isClientError ?: error("Expected Error trait on shape $errShape")) 400 else 500 + val defaultCode = if (errShape.expectTrait().isClientError) 400 else 500 val httpStatusCode = errShape.getTrait()?.code ?: defaultCode writer.write("register(code = #S, deserializer = $deserializerName(), httpStatusCode = $httpStatusCode)", code) }