diff --git a/CHANGELOG.md b/CHANGELOG.md index 495ef2143..9cb6e4774 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,454 @@ +August 1st, 2023 +================ +**Breaking Changes:** +- βš πŸŽ‰ (server, [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/awslabs/smithy-rs/issues/2827), @hlbarber) The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: + + - A `ServiceShape` trait has been added. + - The `Plugin` trait has been simplified. + - The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to. + - The `Operation` structure has been removed. + - A `Scoped` `Plugin` has been added. + + The `Plugin` trait has now been simplified and the `Operation` struct has been removed. + + ## Addition of `ServiceShape` + + Since the [0.52 release](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. + + ```rust + /// Models the [Smithy Operation shape]. + /// + /// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation + pub trait OperationShape { + /// The ID of the operation. + const ID: ShapeId; + + /// The operation input. + type Input; + /// The operation output. + type Output; + /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error + /// exists. + type Error; + } + ``` + + This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. + + We continue with this approach and introduce the following trait: + + ```rust + /// Models the [Smithy Service shape]. + /// + /// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html + pub trait ServiceShape { + /// The [`ShapeId`] of the service. + const ID: ShapeId; + + /// The version of the service. + const VERSION: Option<&'static str>; + + /// The [Protocol] applied to this service. + /// + /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html + type Protocol; + + /// An enumeration of all operations contained in this service. + type Operations; + } + ``` + + With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time. + + ## Simplication of the `Plugin` trait + + Previously, + + ```rust + trait Plugin { + type Service; + type Layer; + + fn map(&self, input: Operation) -> Operation; + } + ``` + + modified an `Operation`. + + Now, + + ```rust + trait Plugin { + type Output; + + fn apply(&self, input: T) -> Self::Output; + } + ``` + + maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. + + Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/awslabs/smithy-rs/issues/2777) for more context. + + The following middleware setup + + ```rust + pub struct PrintService { + inner: S, + name: &'static str, + } + + impl Service for PrintService + where + S: Service, + { + async fn call(&mut self, req: R) -> Self::Future { + println!("Hi {}", self.name); + self.inner.call(req) + } + } + + pub struct PrintLayer { + name: &'static str, + } + + impl Layer for PrintLayer { + type Service = PrintService; + + fn layer(&self, service: S) -> Self::Service { + PrintService { + inner: service, + name: self.name, + } + } + } + + pub struct PrintPlugin; + + impl Plugin for PrintPlugin + where + Op: OperationShape, + { + type Service = S; + type Layer = Stack; + + fn map(&self, input: Operation) -> Operation { + input.layer(PrintLayer { name: Op::NAME }) + } + } + ``` + + now becomes + + ```rust + pub struct PrintService { + inner: S, + name: &'static str, + } + + impl Service for PrintService + where + S: Service, + { + async fn call(&mut self, req: R) -> Self::Future { + println!("Hi {}", self.name); + self.inner.call(req) + } + } + + pub struct PrintPlugin; + + impl Plugin for PrintPlugin + where + Op: OperationShape, + { + type Output = PrintService; + + fn apply(&self, inner: T) -> Self::Output { + PrintService { inner, name: Op::ID.name() } + } + } + + impl HttpMarker for PrintPlugin { } + ``` + + Alternatively, using the new `ServiceShape`, implemented on `Ser`: + + ```rust + impl Plugin for PrintPlugin + where + Ser: ServiceShape, + { + type Service = PrintService; + + fn apply(&self, inner: T) -> Self::Service { + PrintService { inner, name: Ser::ID.name() } + } + } + ``` + + A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://awslabs.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://awslabs.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: + + ```rust + let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) + /* setters */ + .build() + .unwrap(); + ``` + + To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both: + + - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. + - A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. + + The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. + + Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: + + ```rust + use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin}; + + // Convert from `Layer` to `Plugin` which applies uniformly across all operations + let layer = /* some layer */; + let plugin = PluginLayer(layer); + + // Convert from `Plugin` to `Layer` for some fixed protocol and operation + let plugin = /* some plugin */; + let layer = LayerPlugin::new::(plugin); + ``` + + ## Removal of `PluginPipeline` + + Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type. + + This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful: + + ```rust + use aws_smithy_http_server::plugin::PluginPipeline; + + let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); + ``` + + Now collections of plugins must contain plugins of the same flavor: + + ```rust + use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins}; + + let http_plugins = HttpPlugins::new() + .push(http_plugin) + // .push(model_plugin) // This fails to compile with a helpful error message. + .push(&http_and_model_plugin); + let model_plugins = ModelPlugins::new() + .push(model_plugin) + .push(&http_and_model_plugin); + ``` + + In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections. + + ## Removal of `Operation` + + The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to + + ```rust + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */); + + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_operation(operation) + /* other setters */ + .build() + .unwrap(); + ``` + + to set an operation with a `tower::Service`, and + + ```rust + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */); + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */); + + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_operation(operation) + /* other setters */ + .build() + .unwrap(); + ``` + + to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation. + + We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder: + + ```rust + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_service(/* tower::Service */) + /* other setters */ + .build() + .unwrap(); + ``` + + Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id` + + ```rust + use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin}; + + let plugin = PluginLayer(/* layer */); + let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID); + + let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin) + .get_pokemon_species(/* handler */) + /* other setters */ + .build() + .unwrap(); + ``` + + or the new `Scoped` `Plugin` introduced below. + + # Addition of `Scoped` + + Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + // Only apply `plugin` to `CheckHealth` and `GetStorage` operation + let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID); + ``` + + In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable. + + ```rust + use aws_smithy_http_server::plugin::Scoped; + use pokemon_service_server_sdk::scoped; + + scope! { + /// Includes only the `CheckHealth` and `GetStorage` operation. + struct SomeScope { + includes: [CheckHealth, GetStorage] + } + } + let scoped_plugin = Scoped::new::(plugin); + ``` + +- ⚠ (all, [smithy-rs#2675](https://github.com/awslabs/smithy-rs/issues/2675)) Remove native-tls and add a migration guide. +- ⚠ (client, [smithy-rs#2671](https://github.com/awslabs/smithy-rs/issues/2671))
+ Breaking change in how event stream signing works (click to expand more details) + + This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. + + Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. + + See the changes in https://github.com/awslabs/smithy-rs/pull/2671 for an example of how this was done for SigV4. +
+- ⚠ (all, [smithy-rs#2673](https://github.com/awslabs/smithy-rs/issues/2673)) For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`. +- ⚠ (server, [smithy-rs#2539](https://github.com/awslabs/smithy-rs/issues/2539)) Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case. +- ⚠ (client, [smithy-rs#2728](https://github.com/awslabs/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/awslabs/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`. +- ⚠ (server, [smithy-rs#2676](https://github.com/awslabs/smithy-rs/issues/2676), [smithy-rs#2685](https://github.com/awslabs/smithy-rs/issues/2685)) Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration +- ⚠ (server, [smithy-rs#2457](https://github.com/awslabs/smithy-rs/issues/2457), @hlbarber) Remove `PollError` from an operations `Service::Error`. + + Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to + [`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) + no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. +- ⚠ (client, [smithy-rs#2742](https://github.com/awslabs/smithy-rs/issues/2742)) A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it. +- ⚠ (all, [smithy-rs#2893](https://github.com/awslabs/smithy-rs/issues/2893)) Update MSRV to Rust 1.69.0 +- ⚠ (server, [smithy-rs#2678](https://github.com/awslabs/smithy-rs/issues/2678)) `ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. + `OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. + + Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: + + ``` + filter_by_operation_name(plugin, |name| name != Op::ID); + ``` + + Your new filter selects on an operation's absolute name, namespace or name. + + ``` + filter_by_operation_id(plugin, |id| id.name() != Op::ID.name()); + ``` + + The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model. + + You can filter all operations in a namespace or absolute name: + + ``` + filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); + filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); + ``` +- ⚠ (client, [smithy-rs#2758](https://github.com/awslabs/smithy-rs/issues/2758)) The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs. +- ⚠ (server, [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), @hlbarber) Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. + + Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + use pokemon_service_server_sdk::operation_shape::CheckHealth; + + let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME); + ``` + + This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service. + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + use pokemon_service_server_sdk::service::Operation; + + let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth); + ``` + + Similarly, `plugin_from_operation_fn` now allows for + + ```rust + use aws_smithy_http_server::plugin::plugin_from_operation_fn; + use pokemon_service_server_sdk::service::Operation; + + fn map(op: Operation, inner: S) -> PrintService { + match op { + Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner }, + Operation::GetPokemonSpecies => PrintService { name: "hello world", inner }, + _ => todo!() + } + } + + let plugin = plugin_from_operation_fn(map); + ``` +- ⚠ (client, [smithy-rs#2783](https://github.com/awslabs/smithy-rs/issues/2783)) The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`. +- ⚠ (client, [smithy-rs#2845](https://github.com/awslabs/smithy-rs/issues/2845)) `aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`. +- ⚠ (client, [smithy-rs#2848](https://github.com/awslabs/smithy-rs/issues/2848)) The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed. +- ⚠ (server, [smithy-rs#2865](https://github.com/awslabs/smithy-rs/issues/2865)) The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer. +- ⚠ (client, [smithy-rs#2873](https://github.com/awslabs/smithy-rs/issues/2873)) The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets. +- ⚠ (client) The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/awslabs/smithy-rs/discussions/2887) to get your code working again. + +**New this release:** +- πŸŽ‰ (all, [smithy-rs#2647](https://github.com/awslabs/smithy-rs/issues/2647), [smithy-rs#2645](https://github.com/awslabs/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/awslabs/smithy-rs/issues/2646), [smithy-rs#2616](https://github.com/awslabs/smithy-rs/issues/2616), @thomas-k-cameron) Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives +- πŸŽ‰ (client, [smithy-rs#2652](https://github.com/awslabs/smithy-rs/issues/2652), @thomas-k-cameron) Add a `send_with` function on `-Input` types for sending requests without fluent builders +- (client, [smithy-rs#2791](https://github.com/awslabs/smithy-rs/issues/2791), @davidsouther) Add accessors to Builders +- (all, [smithy-rs#2786](https://github.com/awslabs/smithy-rs/issues/2786), @yotamofek) Avoid intermediate vec allocations in AggregatedBytes::to_vec. +- πŸ› (server, [smithy-rs#2733](https://github.com/awslabs/smithy-rs/issues/2733), @thor-bjorgvinsson) Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation. +- (client, [smithy-rs#2728](https://github.com/awslabs/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/awslabs/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported. +- πŸ› (client, [smithy-rs#2767](https://github.com/awslabs/smithy-rs/issues/2767), @mcmasn-amzn) Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces. +- (client, [smithy-rs#2854](https://github.com/awslabs/smithy-rs/issues/2854)) Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible. +- (server, [smithy-rs#2866](https://github.com/awslabs/smithy-rs/issues/2866)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. + Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: + ``` + HTTP/1.1 400 Bad Request + content-type: application/json + x-amzn-errortype: com.example.service#InvalidRequestException + ... + ``` + Example server error response now: + ``` + HTTP/1.1 400 Bad Request + content-type: application/json + x-amzn-errortype: InvalidRequestException + ... + ``` + +**Contributors** +Thank you for your contributions! ❀ +- @davidsouther ([smithy-rs#2791](https://github.com/awslabs/smithy-rs/issues/2791)) +- @hlbarber ([smithy-rs#2457](https://github.com/awslabs/smithy-rs/issues/2457), [smithy-rs#2740](https://github.com/awslabs/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/awslabs/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/awslabs/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/awslabs/smithy-rs/issues/2827)) +- @mcmasn-amzn ([smithy-rs#2767](https://github.com/awslabs/smithy-rs/issues/2767)) +- @thomas-k-cameron ([smithy-rs#2616](https://github.com/awslabs/smithy-rs/issues/2616), [smithy-rs#2645](https://github.com/awslabs/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/awslabs/smithy-rs/issues/2646), [smithy-rs#2647](https://github.com/awslabs/smithy-rs/issues/2647), [smithy-rs#2652](https://github.com/awslabs/smithy-rs/issues/2652)) +- @thor-bjorgvinsson ([smithy-rs#2733](https://github.com/awslabs/smithy-rs/issues/2733)) +- @yotamofek ([smithy-rs#2786](https://github.com/awslabs/smithy-rs/issues/2786)) + + May 23rd, 2023 ============== **New this release:** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index a99d1f3af..fc4c4c257 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -9,717 +9,4 @@ # message = "Fix typos in module documentation for generated crates" # references = ["smithy-rs#920"] # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} -# author = "rcoh" - - [[aws-sdk-rust]] - message = "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations." - references = ["smithy-rs#2815"] - meta = { "breaking" = false, "tada" = false, "bug" = true } - author = "relevantsam" - - [[aws-sdk-rust]] - message = "Add accessors to Builders" - references = ["smithy-rs#2791"] - meta = { "breaking" = false, "tada" = false, "bug" = false } - author = "davidsouther" - - [[smithy-rs]] - message = "Add accessors to Builders" - references = ["smithy-rs#2791"] - meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} - author = "davidsouther" - -[[smithy-rs]] -message = "Avoid intermediate vec allocations in AggregatedBytes::to_vec." -author = "yotamofek" -references = ["smithy-rs#2786"] -meta = { "breaking" = false, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation." -author = "thor-bjorgvinsson" -references = ["smithy-rs#2733"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "server" } - -[[aws-sdk-rust]] -message = "Remove native-tls and add a migration guide." -author = "82marbag" -references = ["smithy-rs#2675"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Remove native-tls and add a migration guide." -author = "82marbag" -references = ["smithy-rs#2675"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[aws-sdk-rust]] -message = "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*" -references = ["smithy-rs#2722", "aws-sdk-rust#703"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - -[[aws-sdk-rust]] -message = "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created." -references = ["smithy-rs#2720"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[smithy-rs]] -message = """ -
-Breaking change in how event stream signing works (click to expand more details) - -This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. - -Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. - -See the changes in https://github.com/awslabs/smithy-rs/pull/2671 for an example of how this was done for SigV4. -
-""" -references = ["smithy-rs#2671"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`." -references = ["smithy-rs#2673"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`." -references = ["smithy-rs#2673"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature." -references = ["smithy-rs#2730"] -author = "cholcombe973" -meta = { "breaking" = false, "tada" = false, "bug" = true } - -[[smithy-rs]] -message = "Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case." -references = ["smithy-rs#2539"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - -[[smithy-rs]] -message = "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = "Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration" -author = "david-perez" -references = ["smithy-rs#2676", "smithy-rs#2685"] -meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } - -[[smithy-rs]] -message = """Remove `PollError` from an operations `Service::Error`. - -Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to -[`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) -no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. -""" -references = ["smithy-rs#2457"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "hlbarber" - -[[aws-sdk-rust]] -message = "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction." -meta = { "breaking" = false, "tada" = true, "bug" = false } -references = ["smithy-rs#2707", "aws-sdk-rust#114", "smithy-rs#2846"] -author = "rcoh" - -[[smithy-rs]] -message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it." -references = ["smithy-rs#2742"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it." -references = ["smithy-rs#2742"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Update MSRV to Rust 1.69.0" -references = ["smithy-rs#2893"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "Velfi" - -[[smithy-rs]] -message = "Update MSRV to Rust 1.69.0" -references = ["smithy-rs#2893"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "Velfi" - -[[smithy-rs]] -message = """`ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. -`OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. - -Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: - -``` -filter_by_operation_name(plugin, |name| name != Op::ID); -``` - -Your new filter selects on an operation's absolute name, namespace or name. - -``` -filter_by_operation_id(plugin, |id| id.name() != Op::ID.name()); -``` - -The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model. - -You can filter all operations in a namespace or absolute name: - -``` -filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); -filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); -``` -""" -author = "82marbag" -references = ["smithy-rs#2678"] -meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } - -[[smithy-rs]] -message = "The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs." -references = ["smithy-rs#2758"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = """The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: - -- A `ServiceShape` trait has been added. -- The `Plugin` trait has been simplified. -- The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to. -- The `Operation` structure has been removed. -- A `Scoped` `Plugin` has been added. - -The `Plugin` trait has now been simplified and the `Operation` struct has been removed. - -## Addition of `ServiceShape` - -Since the [0.52 release](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. - -```rust -/// Models the [Smithy Operation shape]. -/// -/// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation -pub trait OperationShape { - /// The ID of the operation. - const ID: ShapeId; - - /// The operation input. - type Input; - /// The operation output. - type Output; - /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error - /// exists. - type Error; -} -``` - -This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. - -We continue with this approach and introduce the following trait: - -```rust -/// Models the [Smithy Service shape]. -/// -/// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html -pub trait ServiceShape { - /// The [`ShapeId`] of the service. - const ID: ShapeId; - - /// The version of the service. - const VERSION: Option<&'static str>; - - /// The [Protocol] applied to this service. - /// - /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html - type Protocol; - - /// An enumeration of all operations contained in this service. - type Operations; -} -``` - -With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time. - -## Simplication of the `Plugin` trait - -Previously, - -```rust -trait Plugin { - type Service; - type Layer; - - fn map(&self, input: Operation) -> Operation; -} -``` - -modified an `Operation`. - -Now, - -```rust -trait Plugin { - type Output; - - fn apply(&self, input: T) -> Self::Output; -} -``` - -maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. - -Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/awslabs/smithy-rs/issues/2777) for more context. - -The following middleware setup - -```rust -pub struct PrintService { - inner: S, - name: &'static str, -} - -impl Service for PrintService -where - S: Service, -{ - async fn call(&mut self, req: R) -> Self::Future { - println!("Hi {}", self.name); - self.inner.call(req) - } -} - -pub struct PrintLayer { - name: &'static str, -} - -impl Layer for PrintLayer { - type Service = PrintService; - - fn layer(&self, service: S) -> Self::Service { - PrintService { - inner: service, - name: self.name, - } - } -} - -pub struct PrintPlugin; - -impl Plugin for PrintPlugin -where - Op: OperationShape, -{ - type Service = S; - type Layer = Stack; - - fn map(&self, input: Operation) -> Operation { - input.layer(PrintLayer { name: Op::NAME }) - } -} -``` - -now becomes - -```rust -pub struct PrintService { - inner: S, - name: &'static str, -} - -impl Service for PrintService -where - S: Service, -{ - async fn call(&mut self, req: R) -> Self::Future { - println!("Hi {}", self.name); - self.inner.call(req) - } -} - -pub struct PrintPlugin; - -impl Plugin for PrintPlugin -where - Op: OperationShape, -{ - type Output = PrintService; - - fn apply(&self, inner: T) -> Self::Output { - PrintService { inner, name: Op::ID.name() } - } -} - -impl HttpMarker for PrintPlugin { } -``` - -Alternatively, using the new `ServiceShape`, implemented on `Ser`: - -```rust -impl Plugin for PrintPlugin -where - Ser: ServiceShape, -{ - type Service = PrintService; - - fn apply(&self, inner: T) -> Self::Service { - PrintService { inner, name: Ser::ID.name() } - } -} -``` - -A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://awslabs.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://awslabs.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: - -```rust -let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) - /* setters */ - .build() - .unwrap(); -``` - -To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both: - -- A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. -- A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. - -The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. - -Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: - -```rust -use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin}; - -// Convert from `Layer` to `Plugin` which applies uniformly across all operations -let layer = /* some layer */; -let plugin = PluginLayer(layer); - -// Convert from `Plugin` to `Layer` for some fixed protocol and operation -let plugin = /* some plugin */; -let layer = LayerPlugin::new::(plugin); -``` - -## Removal of `PluginPipeline` - -Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type. - -This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful: - -```rust -use aws_smithy_http_server::plugin::PluginPipeline; - -let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); -``` - -Now collections of plugins must contain plugins of the same flavor: - -```rust -use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins}; - -let http_plugins = HttpPlugins::new() - .push(http_plugin) - // .push(model_plugin) // This fails to compile with a helpful error message. - .push(&http_and_model_plugin); -let model_plugins = ModelPlugins::new() - .push(model_plugin) - .push(&http_and_model_plugin); -``` - -In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections. - -## Removal of `Operation` - -The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to - -```rust -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */); - -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_operation(operation) - /* other setters */ - .build() - .unwrap(); -``` - -to set an operation with a `tower::Service`, and - -```rust -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */); -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */); - -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_operation(operation) - /* other setters */ - .build() - .unwrap(); -``` - -to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation. - -We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder: - -```rust -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_service(/* tower::Service */) - /* other setters */ - .build() - .unwrap(); -``` - -Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id` - -```rust -use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin}; - -let plugin = PluginLayer(/* layer */); -let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID); - -let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin) - .get_pokemon_species(/* handler */) - /* other setters */ - .build() - .unwrap(); -``` - -or the new `Scoped` `Plugin` introduced below. - -# Addition of `Scoped` - -Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -// Only apply `plugin` to `CheckHealth` and `GetStorage` operation -let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID); -``` - -In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable. - -```rust -use aws_smithy_http_server::plugin::Scoped; -use pokemon_service_server_sdk::scoped; - -scope! { - /// Includes only the `CheckHealth` and `GetStorage` operation. - struct SomeScope { - includes: [CheckHealth, GetStorage] - } -} -let scoped_plugin = Scoped::new::(plugin); -``` - -""" -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779", "smithy-rs#2827"] -meta = { "breaking" = true, "tada" = true, "bug" = false, target = "server" } -author = "hlbarber" - -[[smithy-rs]] -message = "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives" -author = "thomas-k-cameron" -meta = { "breaking" = false, "tada" = true, "bug" = false, target = "all" } -references = [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616", -] - -[[aws-sdk-rust]] -message = "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives" -author = "thomas-k-cameron" -meta = { "breaking" = false, "tada" = true, "bug" = false } -references = [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616", -] - -[[smithy-rs]] -message = "Add a `send_with` function on `-Input` types for sending requests without fluent builders" -author = "thomas-k-cameron" -references = ["smithy-rs#2652"] -meta = { "breaking" = false, "tada" = true, "bug" = false, target = "client" } - -[[aws-sdk-rust]] -message = "Add a `send_with` function on `-Input` types for sending requests without fluent builders" -author = "thomas-k-cameron" -references = ["smithy-rs#2652"] -meta = { "breaking" = false, "tada" = true, "bug" = false } - -[[smithy-rs]] -message = """Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. - -Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -use pokemon_service_server_sdk::operation_shape::CheckHealth; - -let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME); -``` - -This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service. - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -use pokemon_service_server_sdk::service::Operation; - -let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth); -``` - -Similarly, `plugin_from_operation_fn` now allows for - -```rust -use aws_smithy_http_server::plugin::plugin_from_operation_fn; -use pokemon_service_server_sdk::service::Operation; - -fn map(op: Operation, inner: S) -> PrintService { - match op { - Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner }, - Operation::GetPokemonSpecies => PrintService { name: "hello world", inner }, - _ => todo!() - } -} - -let plugin = plugin_from_operation_fn(map); -``` -""" -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] -meta = { "breaking" = true, "tada" = false, "bug" = false, target = "server" } -author = "hlbarber" - -[[smithy-rs]] -message = "Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces." -author = "mcmasn-amzn" -references = ["smithy-rs#2767"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } - -[[smithy-rs]] -message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." -references = ["smithy-rs#2783"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." -references = ["smithy-rs#2783"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "`aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`." -references = ["smithy-rs#2845"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed." -references = ["smithy-rs#2845"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[smithy-rs]] -message = "The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed." -references = ["smithy-rs#2848"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = "Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible." -references = ["smithy-rs#2854"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility." -references = ["smithy-rs#2724"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = "The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer." -references = ["smithy-rs#2865"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - -[[aws-sdk-rust]] -message = "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client." -references = ["aws-sdk-rust#579", "aws-sdk-rust#338"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = """ -[RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. -Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: -``` -HTTP/1.1 400 Bad Request -content-type: application/json -x-amzn-errortype: com.example.service#InvalidRequestException -... -``` -Example server error response now: -``` -HTTP/1.1 400 Bad Request -content-type: application/json -x-amzn-errortype: InvalidRequestException -... -``` -""" -references = ["smithy-rs#2866"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - - -[[smithy-rs]] -message = "The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets." -meta = { "breaking" = true, "tada" = false , "bug" = false, "target" = "client" } -author = "rcoh" -references = ["smithy-rs#2873"] - -[[aws-sdk-rust]] -message = """The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.""" -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" -references = ["smithy-rs#2877"] - -[[aws-sdk-rust]] -message = """The `doc(hidden)` `with_env` in `ProviderConfig` was removed.""" -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "rcoh" -references = ["smithy-rs#2877"] - -[[aws-sdk-rust]] -message = "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes." -references = [] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "jdisanti" - -[[smithy-rs]] -message = "The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/awslabs/smithy-rs/discussions/2887) to get your code working again." -references = [] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client"} -author = "jdisanti" +# author = "rcoh" \ No newline at end of file diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 1beee31b1..cb5a407d3 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -5,150 +5,6 @@ { "smithy-rs": [], "aws-sdk-rust": [ - { - "message": "Integrate Endpoints 2.0 into the Rust SDK. Endpoints 2.0 enables features like S3 virtual addressing & S3\nobject lambda. As part of this change, there are several breaking changes although efforts have been made to deprecate\nwhere possible to smooth the upgrade path.\n1. `aws_smithy_http::endpoint::Endpoint` and the `endpoint_resolver` methods have been deprecated. In general, these usages\n should be replaced with usages of `endpoint_url` instead. `endpoint_url` accepts a string so an `aws_smithy_http::Endpoint`\n does not need to be constructed. This structure and methods will be removed in a future release.\n2. The `endpoint_resolver` method on `::config::Builder` now accepts a service specific endpoint resolver instead\n of an implementation of `ResolveAwsEndpoint`. Most users will be able to replace these usages with a usage of `endpoint_url`.\n3. `ResolveAwsEndpoint` has been deprecated and will be removed in a future version of the SDK.\n4. The SDK does not support \"pseudo regions\" anymore. Specifically, regions like `iam-fips` will no longer resolve to a FIPS endpoint.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#1784", - "smithy-rs#2074" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add additional configuration parameters to `aws_sdk_s3::Config`.\n\nThe launch of endpoints 2.0 includes more configuration options for S3. The default behavior for endpoint resolution has\nbeen changed. Before, all requests hit the path-style endpoint. Going forward, all requests that can be routed to the\nvirtually hosted bucket will be routed there automatically.\n- `force_path_style`: Requests will now default to the virtually-hosted endpoint `.s3..amazonaws.com`\n- `use_arn_region`: Enables this client to use an ARN’s region when constructing an endpoint instead of the client’s configured region.\n- `accelerate`: Enables this client to use S3 Transfer Acceleration endpoints.\n\nNote: the AWS SDK for Rust does not currently support Multi Region Access Points (MRAP).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#1784", - "smithy-rs#2074" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Move types for AWS SDK credentials to a separate crate.\nA new AWS runtime crate called `aws-credential-types` has been introduced. Types for AWS SDK credentials have been moved to that crate from `aws-config` and `aws-types`. The new crate is placed at the top of the dependency graph among AWS runtime crates with the aim of the downstream crates having access to the types defined in it.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2108" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add support for overriding profile name and profile file location across all providers. Prior to this change, each provider needed to be updated individually.\n\n### Before\n```rust\nuse aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\nuse aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n\nlet profile_files = ProfileFiles::builder()\n .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n .build();\nlet credentials_provider = ProfileFileCredentialsProvider::builder()\n .profile_files(profile_files.clone())\n .build();\nlet region_provider = ProfileFileRegionProvider::builder()\n .profile_files(profile_files)\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .region(region_provider)\n .load()\n .await;\n```\n\n### After\n```rust\nuse aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\nuse aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n\nlet profile_files = ProfileFiles::builder()\n .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n .build();\nlet sdk_config = aws_config::from_env()\n .profile_files(profile_files)\n .load()\n .await;\n/// ```\n", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2152" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "`aws_config::profile::retry_config` && `aws_config::environment::retry_config` have been removed. Use `aws_config::default_provider::retry_config` instead.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2162" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add support for resolving FIPS and dual-stack endpoints.\n\nFIPS and dual-stack endpoints can each be configured in multiple ways:\n1. Automatically from the environment and AWS profile\n2. Across all clients loaded from the same `SdkConfig` via `from_env().use_dual_stack(true).load().await`\n3. At a client level when constructing the configuration for an individual client.\n\nNote: Not all services support FIPS and dual-stack.\n", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#2168" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Improve SDK credentials caching through type safety. `LazyCachingCredentialsProvider` has been renamed to `LazyCredentialsCache` and is no longer treated as a credentials provider. Furthermore, you do not create a `LazyCredentialsCache` directly, and instead you interact with `CredentialsCache`. This introduces the following breaking changes.\n\nIf you previously used `LazyCachingCredentialsProvider`, you can replace it with `CredentialsCache`.\n
\nExample\n\nBefore:\n```rust\nuse aws_config::meta::credentials::lazy_caching::LazyCachingCredentialsProvider;\nuse aws_types::provider::ProvideCredentials;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet credentials_provider =\n LazyCachingCredentialsProvider::builder()\n .load(make_provider())\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_credential_types::cache::CredentialsCache;\nuse aws_types::provider::ProvideCredentials;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\n// Wrapping a result of `make_provider` in `LazyCredentialsCache` is done automatically.\nlet sdk_config = aws_config::from_env()\n .credentials_cache(CredentialsCache::lazy()) // This line can be omitted because it is on by default.\n .credentials_provider(make_provider())\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nIf you previously configured a `LazyCachingCredentialsProvider`, you can use the builder for `LazyCredentialsCache` instead.\n\nBefore:\n```rust\nuse aws_config::meta::credentials::lazy_caching::LazyCachingCredentialsProvider;\nuse aws_types::provider::ProvideCredentials;\nuse std::time::Duration;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet credentials_provider =\n LazyCachingCredentialsProvider::builder()\n .load(make_provider())\n .load_timeout(Duration::from_secs(60)) // Configures timeout.\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_credential_types::cache::CredentialsCache;\nuse aws_types::provider::ProvideCredentials;\nuse std::time::Duration;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet sdk_config = aws_config::from_env()\n .credentials_cache(\n CredentialsCache::lazy_builder()\n .load_timeout(Duration::from_secs(60)) // Configures timeout.\n .into_credentials_cache(),\n )\n .credentials_provider(make_provider())\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nThe examples above only demonstrate how to use `credentials_cache` and `credentials_provider` methods on `aws_config::ConfigLoader` but the same code update can be applied when you interact with `aws_types::sdk_config::Builder` or the builder for a service-specific config, e.g. `aws_sdk_s3::config::Builder`.\n\n
\n\n\nIf you previously configured a `DefaultCredentialsChain` by calling `load_timeout`, `buffer_time`, or `default_credential_expiration` on its builder, you need to call the same set of methods on the builder for `LazyCredentialsCache` instead.\n
\nExample\n\nBefore:\n```rust\nuse aws_config::default_provider::credentials::DefaultCredentialsChain;\nuse std::time::Duration;\n\nlet credentials_provider = DefaultCredentialsChain::builder()\n .buffer_time(Duration::from_secs(30))\n .default_credential_expiration(Duration::from_secs(20 * 60))\n .build()\n .await;\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_config::default_provider::credentials::default_provider;\nuse aws_credential_types::cache::CredentialsCache;\nuse std::time::Duration;\n\n// Previously used methods no longer exist on the builder for `DefaultCredentialsChain`.\nlet credentials_provider = default_provider().await;\n\nlet sdk_config = aws_config::from_env()\n .credentials_cache(\n CredentialsCache::lazy_builder()\n .buffer_time(Duration::from_secs(30))\n .default_credential_expiration(Duration::from_secs(20 * 60))\n .into_credentials_cache(),\n )\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\n
\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2122", - "smithy-rs#2227" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "The introduction of `CredentialsCache` comes with an accompanying type `SharedCredentialsCache`, which we will store in the property bag instead of a `SharedCredentialsProvider`. As a result, `aws_http::auth:set_provider` has been updated to `aws_http::auth::set_credentials_cache`.\n\nBefore:\n```rust\nuse aws_credential_types::Credentials;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_http::auth::set_provider;\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::operation;\n\nlet mut req = operation::Request::new(http::Request::new(SdkBody::from(\"some body\")));\nlet credentials = Credentials::new(\"example\", \"example\", None, None, \"my_provider_name\");\nset_provider(\n &mut req.properties_mut(),\n SharedCredentialsProvider::new(credentials),\n);\n```\n\nAfter:\n```rust\nuse aws_credential_types::Credentials;\nuse aws_credential_types::cache::{CredentialsCache, SharedCredentialsCache};\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_http::auth::set_credentials_cache;\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::operation;\n\nlet mut req = operation::Request::new(http::Request::new(SdkBody::from(\"some body\")));\nlet credentials = Credentials::new(\"example\", \"example\", None, None, \"my_provider_name\");\nlet credentials_cache = CredentialsCache::lazy_builder()\n .into_credentials_cache()\n .create_cache(SharedCredentialsProvider::new(credentials));\nset_credentials_cache(\n &mut req.properties_mut(),\n SharedCredentialsCache::new(credentials_cache),\n);\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2122", - "smithy-rs#2227" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Fix endpoint for s3.write_get_object_response(). This bug was introduced in 0.53.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2204" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Add `with_test_defaults()` and `set_test_defaults()` to `::Config`. These methods fill in defaults for configuration that is mandatory to successfully send a request.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2204" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, { "message": "Request IDs can now be easily retrieved on successful responses. For example, with S3:\n```rust\n// Import the trait to get the `request_id` method on outputs\nuse aws_sdk_s3::types::RequestId;\nlet output = client.list_buckets().send().await?;\nprintln!(\"Request ID: {:?}\", output.request_id());\n```\n", "meta": { @@ -162,7 +18,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Retrieving a request ID from errors now requires importing the `RequestId` trait. For example, with S3:\n```rust\nuse aws_sdk_s3::types::RequestId;\nprintln!(\"Request ID: {:?}\", error.request_id());\n```\n", @@ -177,7 +33,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these.", @@ -192,7 +48,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.\n
\nExample with S3\n**Before:**\n```rust\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError { kind, .. } => match kind {\n GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n }\n err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n**After:**\n```rust\n// Needed to access the `.code()` function on the error type:\nuse aws_sdk_s3::types::ProvideErrorMetadata;\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError::InvalidObjectState(value) => {\n println!(\"invalid object state: {:?}\", value);\n }\n GetObjectError::NoSuchKey(_) => {\n println!(\"object didn't exist\");\n }\n err if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n
\n", @@ -208,7 +64,7 @@ "smithy-rs#2075" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`.", @@ -223,7 +79,7 @@ "smithy-rs#2129" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated.", @@ -237,7 +93,7 @@ "aws-sdk-rust#740" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "`SdkError` variants can now be constructed for easier unit testing.", @@ -252,7 +108,7 @@ "smithy-rs#2208" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`.", @@ -267,7 +123,7 @@ "aws-sdk-rust#600" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Enable presigning for S3's `HeadObject` operation.", @@ -282,7 +138,7 @@ "smithy-rs#2451" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "The modules in the SDK crates have been reorganized. See the [SDK Crate Reorganization Upgrade Guidance](https://github.com/awslabs/aws-sdk-rust/discussions/752) to see how to fix your code after this change.", @@ -296,7 +152,7 @@ "smithy-rs#2433" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Reconnect on transient errors.\n\nIf a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not\nbe reused. This is enabled by default for all AWS services. It can be disabled by setting `RetryConfig::with_reconnect_mode`\n\nAlthough there is no API breakage from this change, it alters the client behavior in a way that may cause breakage for customers.\n", @@ -311,7 +167,7 @@ "smithy-rs#2445" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Update MSRV to 1.66.1", @@ -325,7 +181,7 @@ "smithy-rs#2467" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Default connector provided by `aws-config` now respects `ConnectorSettings`.\n\nPreviously, it used the timeout settings provided by aws-config. A test from @Oliboy50 has been incorporated to verify this behavior.\n\n**Behavior Change**: Prior to this change, the Hyper client would be shared between all service clients. After this change, each service client will use its own Hyper Client.\nTo revert to the previous behavior, set `HttpConnector::Prebuilt` on `SdkConfig::http_connector`.\n", @@ -341,7 +197,7 @@ "smithy-rs#2151" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Remove deprecated `ResolveAwsEndpoint` interfaces.\n[For details see the longform changelog entry](https://github.com/awslabs/aws-sdk-rust/discussions/755).\n", @@ -356,7 +212,7 @@ "smithy-rs#1784" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001)", @@ -370,7 +226,7 @@ "smithy-rs#2474" ], "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "age": 4 }, { "message": "Implement std::error::Error#source() properly for the service meta Error enum.", @@ -384,7 +240,7 @@ "aws-sdk-rust#784" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "The outputs for event stream operations (for example, S3's SelectObjectContent) now implement the `Sync` auto-trait.", @@ -398,7 +254,7 @@ "smithy-rs#2496" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "The AWS SDK now compiles for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!", @@ -412,7 +268,7 @@ "smithy-rs#2254" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "S3's `GetObject` will no longer panic when checksum validation is enabled and the target object was uploaded as a multi-part upload.\nHowever, these objects cannot be checksum validated by the SDK due to the way checksums are calculated for multipart uploads.\nFor more information, see [this page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums).\n", @@ -426,7 +282,7 @@ "aws-sdk-rust#764" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "`AppName` is now configurable from within `ConfigLoader`.", @@ -440,7 +296,7 @@ "smithy-rs#2513" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Add support for omitting session token in canonical requests for SigV4 signing.", @@ -454,7 +310,7 @@ "smithy-rs#2473" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions.", @@ -468,7 +324,7 @@ "smithy-rs#2525" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Fix bug where an incorrect endpoint was produced for `WriteGetObjectResponse`", @@ -483,7 +339,7 @@ "aws-sdk-rust#781" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Update the `std::fmt::Debug` implementation for `aws-sigv4::SigningParams` so that it will no longer print sensitive information.", @@ -497,7 +353,7 @@ "smithy-rs#2562" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "`aws_smithy_types::date_time::Format` has been re-exported in SDK crates.", @@ -511,7 +367,7 @@ "smithy-rs#2534" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Reduce several instances of credential exposure in the SDK logs:\n- IMDS now suppresses the body of the response from logs\n- `aws-sigv4` marks the `x-amz-session-token` header as sensitive\n- STS & SSO credentials have been manually marked as sensitive which suppresses logging of response bodies for relevant operations\n", @@ -525,7 +381,7 @@ "smithy-rs#2603" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Update MSRV to Rust 1.67.1", @@ -539,7 +395,7 @@ "smithy-rs#2611" ], "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "age": 3 }, { "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", @@ -554,8 +410,295 @@ "smithy-rs#2694" ], "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", + "age": 2 + }, + { + "message": "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "relevantsam", + "references": [ + "smithy-rs#2815" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Add accessors to Builders", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "davidsouther", + "references": [ + "smithy-rs#2791" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Remove native-tls and add a migration guide.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "82marbag", + "references": [ + "smithy-rs#2675" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2722", + "aws-sdk-rust#703" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2720" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [ + "smithy-rs#2673" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature.", + "meta": { + "bug": true, + "breaking": false, + "tada": false + }, + "author": "cholcombe973", + "references": [ + "smithy-rs#2730" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2728", + "smithy-rs#2262", + "aws-sdk-rust#2087" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.with_endpoint_discovery_enabled()` on the `Client` after construction.", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "rcoh", + "references": [ + "smithy-rs#2707", + "aws-sdk-rust#114", + "smithy-rs#2846" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2742" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Update MSRV to Rust 1.69.0", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "Velfi", + "references": [ + "smithy-rs#2893" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "thomas-k-cameron", + "references": [ + "smithy-rs#2647", + "smithy-rs#2645", + "smithy-rs#2646", + "smithy-rs#2616" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "Add a `send_with` function on `-Input` types for sending requests without fluent builders", + "meta": { + "bug": false, + "breaking": false, + "tada": true + }, + "author": "thomas-k-cameron", + "references": [ + "smithy-rs#2652" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2783" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The implementation `From` for `aws_http::user_agent::UserAgentStageError` has been removed.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "ysaito1001", + "references": [ + "smithy-rs#2845" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The AppName property can now be set with `sdk_ua_app_id` in profile files. The old field, `sdk-ua-app-id`, is maintained for backwards compatibility.", + "meta": { + "bug": false, + "breaking": false, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2724" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "**Behavior change**: Credential providers now share the HTTP connector used by the SDK. If you want to keep a separate connector for clients, use `::ConfigBuilder::http_connector` when constructing the client.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "aws-sdk-rust#579", + "aws-sdk-rust#338" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The `doc(hidden)` `time_source` in `aws-credential-types` was removed. Use `aws_smithy_async::time` instead.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2877" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The `doc(hidden)` `with_env` in `ProviderConfig` was removed.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "rcoh", + "references": [ + "smithy-rs#2877" + ], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", + "age": 1 + }, + { + "message": "The underlying architecture of the SDK clients has been overhauled. This shouldn't require any changes for most projects, but will affect projects that customize the SDK middleware. More details are available in the [upgrade guide](https://github.com/awslabs/aws-sdk-rust/discussions/853) if you are effected by these changes.", + "meta": { + "bug": false, + "breaking": true, + "tada": false + }, + "author": "jdisanti", + "references": [], + "since-commit": "6eaacaa96684f662b7d355eea94a526c0b465e7f", "age": 1 } ], "aws-sdk-model": [] -} +} \ No newline at end of file