Skip to content

Stop serializing server framework-level errors manually #3716

Open
@david-perez

Description

@david-perez

We're currently serializing server framework-level errors manually. We're doing this for each protocol. For example, for restJson1:

impl IntoResponse<RestJson1> for RuntimeError {
fn into_response(self) -> http::Response<crate::body::BoxBody> {
let res = http::Response::builder()
.status(self.status_code())
.header("Content-Type", "application/json")
.header("X-Amzn-Errortype", self.name())
.extension(RuntimeErrorExtension::new(self.name().to_string()));
let body = match self {
RuntimeError::Validation(reason) => crate::body::to_boxed(reason),
_ => crate::body::to_boxed("{}"),
};
res.body(body)
.expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)
}
}

Instead of manually writing this serialization code, we should model these errors as Smithy structure shapes with the @error trait, adjoin them automatically to all models, and leverage the code-generated serializers. This is the approach that smithy-typescript uses.

This has the advantage of reducing the amount of code that we need to maintain, and reducing possible bugs introduced in the manual implementations that don't honor the protocol specifications.

Metadata

Metadata

Assignees

No one assigned

    Labels

    serverRust server SDK

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions