From 8e6a0f6c1222a41d395dd23a6958186438bf4549 Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 09:43:14 +0100 Subject: [PATCH 1/7] changelog --- axum-core/CHANGELOG.md | 17 ++ axum-extra/CHANGELOG.md | 41 ++++ axum-macros/CHANGELOG.md | 26 +++ axum/CHANGELOG.md | 410 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 493 insertions(+), 1 deletion(-) diff --git a/axum-core/CHANGELOG.md b/axum-core/CHANGELOG.md index 3eefc21e73..1ac82cfa6a 100644 --- a/axum-core/CHANGELOG.md +++ b/axum-core/CHANGELOG.md @@ -9,6 +9,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - None. +# 0.3.0 (25. November, 2022) + +- **breaking:** `FromRequest` has been reworked and `RequestParts` has been + removed. See axum's changelog for more details ([#1272]) +- **added:** Added new `FromRequestParts` trait. See axum's changelog for more + details ([#1272]) +- **breaking:** `BodyAlreadyExtracted` has been removed ([#1272]) +- **breaking:** `AppendHeaders` now works on any `impl IntoIterator` ([#1495]) + +[#1272]: https://github.com/tokio-rs/axum/pull/1272 +[#1495]: https://github.com/tokio-rs/axum/pull/1495 + +
+0.3.0 Pre-Releases + # 0.3.0-rc.3 (8. November, 2022) - **added:** Add `DefaultBodyLimit::max` for changing the default body limit ([#1397]) @@ -47,6 +62,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#1155]: https://github.com/tokio-rs/axum/pull/1155 [#1272]: https://github.com/tokio-rs/axum/pull/1272 +
+ # 0.2.8 (10. September, 2022) - **breaking:** Added default limit to how much data `Bytes::from_request` will diff --git a/axum-extra/CHANGELOG.md b/axum-extra/CHANGELOG.md index 611cc094db..a61931d0b5 100644 --- a/axum-extra/CHANGELOG.md +++ b/axum-extra/CHANGELOG.md @@ -9,6 +9,45 @@ and this project adheres to [Semantic Versioning]. - None. +# 0.4.0 (25. November, 2022) + +- **breaking:** `Form` has a new rejection type ([#1496]) +- **breaking:** `Query` has a new rejection type ([#1496]) +- **added:** Add `RouterExt::route_with_tsr` for adding routes with an + additional "trailing slash redirect" route ([#1119]) +- **breaking:** `Resource::nest` and `Resource::nest_collection` has been + removed. You can instead convert the `Resource` into a `Router` and + add additional routes as necessary ([#1086]) +- **changed:** For methods that accept some `S: Service`, the bounds have been + relaxed so the response type must implement `IntoResponse` rather than being a + literal `Response` +- **added:** Support chaining handlers with `HandlerCallWithExtractors::or` ([#1170]) +- **change:** axum-extra's MSRV is now 1.60 ([#1239]) +- **breaking:** `SignedCookieJar` and `PrivateCookieJar` now extracts the keys + from the router's state, rather than extensions +- **added:** Add Protocol Buffer extractor and response ([#1239]) +- **added:** Add `Either*` types for combining extractors and responses into a + single type ([#1263]) +- **added:** `WithRejection` extractor for customizing other extractors' rejections ([#1262]) +- **added:** Add sync constructors to `CookieJar`, `PrivateCookieJar`, and + `SignedCookieJar` so they're easier to use in custom middleware +- **breaking:** `Resource` has a new `S` type param which represents the state ([#1155]) +- **breaking:** `RouterExt::route_with_tsr` now only accepts `MethodRouter`s ([#1155]) +- **added:** `RouterExt::route_service_with_tsr` for routing to any `Service` ([#1155]) + +[#1086]: https://github.com/tokio-rs/axum/pull/1086 +[#1119]: https://github.com/tokio-rs/axum/pull/1119 +[#1155]: https://github.com/tokio-rs/axum/pull/1155 +[#1170]: https://github.com/tokio-rs/axum/pull/1170 +[#1214]: https://github.com/tokio-rs/axum/pull/1214 +[#1239]: https://github.com/tokio-rs/axum/pull/1239 +[#1262]: https://github.com/tokio-rs/axum/pull/1262 +[#1263]: https://github.com/tokio-rs/axum/pull/1263 +[#1496]: https://github.com/tokio-rs/axum/pull/1496 + +
+0.4.0 Pre-Releases + # 0.4.0-rc.3 (19. November, 2022) - **breaking:** Depend axum 0.6.0-rc.5 and axum-macros 0.3.0-rc.3 @@ -53,6 +92,8 @@ and this project adheres to [Semantic Versioning]. [#1262]: https://github.com/tokio-rs/axum/pull/1262 [#1263]: https://github.com/tokio-rs/axum/pull/1263 +
+ # 0.3.7 (09. August, 2022) - **fixed:** Depend on axum 0.5.15 which contains a fix for an accidental breaking change. diff --git a/axum-macros/CHANGELOG.md b/axum-macros/CHANGELOG.md index 2df0b10b43..e4cba573a5 100644 --- a/axum-macros/CHANGELOG.md +++ b/axum-macros/CHANGELOG.md @@ -9,6 +9,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - None. +# 0.3.0 (25. November, 2022) + +- **added:** Add `#[derive(FromRef)]` ([#1430]) +- **added:** Add `#[from_ref(skip)]` to skip implementing `FromRef` for individual fields ([#1537]) +- **added:** Support using a different rejection for `#[derive(FromRequest)]` + with `#[from_request(rejection(MyRejection))]` ([#1256]) +- **breaking:** `#[derive(FromRequest)]` will no longer generate a rejection + enum but instead generate `type Rejection = axum::response::Response`. Use the + new `#[from_request(rejection(MyRejection))]` attribute to change this. + The `rejection_derive` attribute has also been removed ([#1272]) +- **added:** Add `#[derive(FromRequestParts)]` for deriving an implementation of + `FromRequestParts`, similarly to `#[derive(FromRequest)]` ([#1305]) +- **change:** axum-macro's MSRV is now 1.60 ([#1239]) + +[#1239]: https://github.com/tokio-rs/axum/pull/1239 +[#1256]: https://github.com/tokio-rs/axum/pull/1256 +[#1272]: https://github.com/tokio-rs/axum/pull/1272 +[#1305]: https://github.com/tokio-rs/axum/pull/1305 +[#1430]: https://github.com/tokio-rs/axum/pull/1430 +[#1537]: https://github.com/tokio-rs/axum/pull/1537 + +
+0.3.0 Pre-Releases + # 0.3.0-rc.3 (18. November, 2022) - **added:** Add `#[from_ref(skip)]` to skip implementing `FromRef` for individual fields ([#1537]) @@ -38,6 +62,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#1272]: https://github.com/tokio-rs/axum/pull/1272 [#1305]: https://github.com/tokio-rs/axum/pull/1305 +
+ # 0.2.3 (27. June, 2022) - **change:** axum-macros's MSRV is now 1.56 ([#1098]) diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index 7d257c680f..d9f58c43f0 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -7,11 +7,417 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # Unreleased +- None. + +# 0.6.0 (25. November, 2022) + +## Routing + +- **fixed:** Nested routers will now inherit fallbacks from outer routers + unless they define their own fallback ([#1521]) +- **breaking:** The request `/foo/` no longer matches `/foo/*rest`. If you want + to match `/foo/` you have to add a route specifically for that ([#1086]) + + For example: + + ```rust + use axum::{Router, routing::get, extract::Path}; + + let app = Router::new() + // this will match `/foo/bar/baz` + .route("/foo/*rest", get(handler)) + // this will match `/foo/` + .route("/foo/", get(handler)) + // if you want `/foo` to match you must also add an explicit route for it + .route("/foo", get(handler)); + + async fn handler( + // use an `Option` because `/foo/` and `/foo` don't have any path params + params: Option>, + ) {} + ``` + +- **breaking:** Path params for wildcard routes no longer include the prefix + `/`. e.g. `/foo.js` will match `/*filepath` with a value of `foo.js`, _not_ + `/foo.js` ([#1086]) + + For example: + + ```rust + use axum::{Router, routing::get, extract::Path}; + + let app = Router::new().route("/foo/*rest", get(handler)); + + async fn handler( + Path(params): Path, + ) { + // for the request `/foo/bar/baz` the value of `params` will be `bar/baz` + // + // on 0.5 it would be `/bar/baz` + } + ``` + +- **fixed:** Routes like `/foo` and `/*rest` are no longer considered + overlapping. `/foo` will take priority ([#1086]) + + For example: + + ```rust + use axum::{Router, routing::get}; + + let app = Router::new() + // this used to not be allowed but now just works + .route("/foo/*rest", get(foo)) + .route("/foo/bar", get(bar)); + + async fn foo() {} + + async fn bar() {} + ``` + +- **breaking:** Trailing slash redirects have been removed. Previously if you + added a route for `/foo`, axum would redirect calls to `/foo/` to `/foo` (or + vice versa for `/foo/`). That is no longer supported and such requests will + now be sent to the fallback. Consider using + `axum_extra::routing::RouterExt::route_with_tsr` if you want the old behavior + ([#1119]) + + For example: + + ```rust + use axum::{Router, routing::get}; + + let app = Router::new() + // a request to `GET /foo/` will now get `404 Not Found` + // whereas in 0.5 axum would redirect to `/foo` + // + // same goes the other way if you had the route `/foo/` + // axum will no longer redirect from `/foo` to `/foo/` + .route("/foo", get(handler)); + + async fn handler() {} + ``` + +- **breaking:** `Router::fallback` now only accepts `Handler`s (similarly to + what `get`, `post`, etc accept). Use the new `Router::fallback_service` for + setting any `Service` as the fallback ([#1155]) + + This fallback on 0.5: + + ```rust + use axum::{Router, handler::Handler}; + + let app = Router::new().fallback(fallback.into_service()); + + async fn fallback() {} + ``` + + Becomes this in 0.6 + + ```rust + use axum::Router; + + let app = Router::new().fallback(fallback); + + async fn fallback() {} + ``` + +- **breaking:** Allow `Error: Into` for `Route::{layer, route_layer}` ([#924]) +- **breaking:** `MethodRouter` now panics on overlapping routes ([#1102]) +- **breaking:** `Router::route` now only accepts `MethodRouter`s created with + `get`, `post`, etc. Use the new `Router::route_service` for routing to + any `Service`s ([#1155]) +- **breaking:** Adding a `.route_layer` onto a `Router` or `MethodRouter` + without any routes will now result in a panic. Previously, this just did + nothing. [#1327] +- **changed:** `Router::nest` now only accepts `Router`s, the general-purpose + `Service` nesting method has been renamed to `nest_service` ([#1368]) - **breaking:** `RouterService` has been removed since `Router` now implements `Service` when the state is `()`. Use `Router::with_state` to provide the - state and get a `Router<()>` ([#1552]) + state and get a `Router<()>`. Note that `RouterService` only existed in the + pre-releases, not 0.5 ([#1552]) + +## Extractors + +- **added:** Added new type safe `State` extractor. This can be used with + `Router::with_state` and gives compile errors for missing states, whereas + `Extension` would result in runtime errors ([#1155]) + + We recommend migrating from `Extension` to `State` since that is more type + safe and faster. That is done by using `Router::with_state` and `State`. + + This setup in 0.5 + + ```rust + use axum::{routing::get, Extension, Router}; + + let app = Router::new() + .route("/", get(handler)) + .layer(Extension(AppState {})); + + async fn handler(Extension(app_state): Extension) {} + + #[derive(Clone)] + struct AppState {} + ``` + + Becomes this in 0.6 using `State`: + + ```rust + use axum::{routing::get, extract::State, Router}; + + let app = Router::new() + .route("/", get(handler)) + .with_state(AppState {}); + + async fn handler(State(app_state): State) {} + + #[derive(Clone)] + struct AppState {} + ``` + + If you have multiple extensions you can use fields on `AppState` and implement + `FromRef`: + + ```rust + use axum::{extract::{State, FromRef}, routing::get, Router}; + + let state = AppState { + client: HttpClient {}, + database: Database {}, + }; + + let app = Router::new().route("/", get(handler)).with_state(state); + + async fn handler( + State(client): State, + State(database): State, + ) {} + + // the derive requires enabling the "macros" feature + #[derive(Clone, FromRef)] + struct AppState { + client: HttpClient, + database: Database, + } + + #[derive(Clone)] + struct HttpClient {} + + #[derive(Clone)] + struct Database {} + ``` + +- **breaking:** It is now only possible for one extractor per handler to consume + the request body. In 0.5 doing so would result in runtime errors but in 0.6 it + is a compile error ([#1272]) + + axum enforces this by only allowing the _last_ extractor to consume the + request. + + For example: + ```rust + use axum::{Json, http::HeaderMap}; + + // This wont compile on 0.6 because both `Json` and `String` need to consume + // the request body. You can use either `Json` or `String`, but not both. + async fn handler_1( + json: Json, + string: String, + ) {} + + // This won't work either since `Json` is not the last extractor. + async fn handler_2( + json: Json, + headers: HeaderMap, + ) {} + + // This works! + async fn handler_3( + headers: HeaderMap, + json: Json, + ) {} + ``` + + This is done by reworking the `FromRequest` trait and introducing a new + `FromRequestParts` trait. + + If your extractor needs to consume the request body then you should implement + `FromRequest`, otherwise implement `FromRequestParts`. + + This extractor in 0.5: + + ```rust + struct MyExtractor { /* ... */ } + + #[async_trait] + impl FromRequest for MyExtractor + where + B: Send, + { + type Rejection = StatusCode; + + async fn from_request(req: &mut RequestParts) -> Result { + // ... + } + } + ``` + + Becomes this in 0.6: + + ```rust + use axum::{ + extract::{FromRequest, FromRequestParts}, + http::{StatusCode, Request, request::Parts}, + async_trait, + }; + + struct MyExtractor { /* ... */ } + + // implement `FromRequestParts` if you don't need to consume the request body + #[async_trait] + impl FromRequestParts for MyExtractor + where + S: Send + Sync, + { + type Rejection = StatusCode; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + // ... + } + } + + // implement `FromRequest` if you do need to consume the request body + #[async_trait] + impl FromRequest for MyExtractor + where + S: Send + Sync, + B: Send + 'static, + { + type Rejection = StatusCode; + + async fn from_request(req: Request, state: &S) -> Result { + // ... + } + } + ``` + +- **breaking:** `RequestParts` has been removed as part of the `FromRequest` + rework ([#1272]) +- **breaking:** `BodyAlreadyExtracted` has been removed ([#1272]) +- **breaking:** The following types or traits have a new `S` type param + which represents the state ([#1155]): + - `Router`, defaults to `()` + - `MethodRouter`, defaults to `()` + - `FromRequest`, no default + - `Handler`, no default +- **added:** Add `RequestExt` and `RequestPartsExt` which adds convenience + methods for running extractors to `http::Request` and `http::request::Parts` ([#1301]) +- **changed**: The inner error of a `JsonRejection` is now + `serde_path_to_error::Error`. Previously it was + `serde_json::Error` ([#1371]) +- **added**: `JsonRejection` now displays the path at which a deserialization + error occurred ([#1371]) +- **fixed:** Used `400 Bad Request` for `FailedToDeserializeQueryString` + rejections, instead of `422 Unprocessable Entity` ([#1387]) +- **breaking:** `ContentLengthLimit` has been removed. Use `DefaultBodyLimit` instead ([#1400]) +- **changed:** The default body limit now applies to the `Multipart` extractor ([#1420]) +- **added:** `FromRequest` and `FromRequestParts` derive macro re-exports from + [`axum-macros`] behind the `macros` feature ([#1352]) +- **breaking:** `MatchedPath` can now no longer be extracted in middleware for + nested routes. In previous versions it returned invalid data when extracted + from a middleware applied to a nested router. `MatchedPath` can still be + extracted from handlers and middleware that aren't on nested routers ([#1462]) +- **added:** Add `extract::RawForm` for accessing raw urlencoded query bytes or request body ([#1487]) +- **breaking:** Rename `FormRejection::FailedToDeserializeQueryString` to + `FormRejection::FailedToDeserializeForm` ([#1496]) + +## Middleware + +- **breaking:** Remove `extractor_middleware` which was previously deprecated. + Use `axum::middleware::from_extractor` instead ([#1077]) +- **added:** Support running extractors on `middleware::from_fn` functions ([#1088]) +- **added:** Support any middleware response that implements `IntoResponse` ([#1152]) +- **breaking:** Require middleware added with `Handler::layer` to have + `Infallible` as the error type ([#1152]) +- **added**: Add `middleware::from_fn_with_state` and + `middleware::from_fn_with_state_arc` to enable running extractors that require + state ([#1342]) +- **added:** Add `middleware::from_extractor_with_state` ([#1396]) +- **added:** Add `map_request`, `map_request_with_state` for transforming the + request with an async function ([#1408]) +- **added:** Add `map_response`, `map_response_with_state` for transforming the + response with an async function ([#1414]) + +## Misc + +- **changed:** axum's MSRV is now 1.60 ([#1239]) +- **breaking:** New `tokio` default feature needed for WASM support. If you + don't need WASM support but have `default_features = false` for other reasons + you likely need to re-enable the `tokio` feature ([#1382]) +- **added:** Support compiling to WASM. See the `simple-router-wasm` example + for more details ([#1382]) +- **changed:** For methods that accept some `S: Service`, the bounds have been + relaxed so the response type must implement `IntoResponse` rather than being a + literal `Response` +- **fixed:** Annotate panicking functions with `#[track_caller]` so the error + message points to where the user added the invalid route, rather than + somewhere internally in axum ([#1248]) +- **added:** Add `ServiceExt` with methods for turning any `Service` into a + `MakeService` similarly to `Router::into_make_service` ([#1302]) +- **breaking:** `handler::{WithState, IntoService}` are merged into one type, + named `HandlerService` ([#1418]) +- **added:** String and binary `From` impls have been added to `extract::ws::Message` + to be more inline with `tungstenite` ([#1421]) +- **added:** Add `#[derive(axum::extract::FromRef)]` ([#1430]) +- **added:** Add `accept_unmasked_frames` setting in WebSocketUpgrade ([#1529]) +- **added:** Add `WebSocketUpgrade::on_failed_upgrade` to customize what to do + when upgrading a connection fails ([#1539]) + +[#924]: https://github.com/tokio-rs/axum/pull/924 +[#1077]: https://github.com/tokio-rs/axum/pull/1077 +[#1086]: https://github.com/tokio-rs/axum/pull/1086 +[#1088]: https://github.com/tokio-rs/axum/pull/1088 +[#1102]: https://github.com/tokio-rs/axum/pull/1102 +[#1119]: https://github.com/tokio-rs/axum/pull/1119 +[#1152]: https://github.com/tokio-rs/axum/pull/1152 +[#1155]: https://github.com/tokio-rs/axum/pull/1155 +[#1239]: https://github.com/tokio-rs/axum/pull/1239 +[#1248]: https://github.com/tokio-rs/axum/pull/1248 +[#1272]: https://github.com/tokio-rs/axum/pull/1272 +[#1301]: https://github.com/tokio-rs/axum/pull/1301 +[#1302]: https://github.com/tokio-rs/axum/pull/1302 +[#1327]: https://github.com/tokio-rs/axum/pull/1327 +[#1342]: https://github.com/tokio-rs/axum/pull/1342 +[#1346]: https://github.com/tokio-rs/axum/pull/1346 +[#1352]: https://github.com/tokio-rs/axum/pull/1352 +[#1368]: https://github.com/tokio-rs/axum/pull/1368 +[#1371]: https://github.com/tokio-rs/axum/pull/1371 +[#1382]: https://github.com/tokio-rs/axum/pull/1382 +[#1387]: https://github.com/tokio-rs/axum/pull/1387 +[#1389]: https://github.com/tokio-rs/axum/pull/1389 +[#1396]: https://github.com/tokio-rs/axum/pull/1396 +[#1397]: https://github.com/tokio-rs/axum/pull/1397 +[#1400]: https://github.com/tokio-rs/axum/pull/1400 +[#1408]: https://github.com/tokio-rs/axum/pull/1408 +[#1414]: https://github.com/tokio-rs/axum/pull/1414 +[#1418]: https://github.com/tokio-rs/axum/pull/1418 +[#1420]: https://github.com/tokio-rs/axum/pull/1420 +[#1421]: https://github.com/tokio-rs/axum/pull/1421 +[#1430]: https://github.com/tokio-rs/axum/pull/1430 +[#1462]: https://github.com/tokio-rs/axum/pull/1462 +[#1487]: https://github.com/tokio-rs/axum/pull/1487 +[#1496]: https://github.com/tokio-rs/axum/pull/1496 +[#1521]: https://github.com/tokio-rs/axum/pull/1521 +[#1529]: https://github.com/tokio-rs/axum/pull/1529 +[#1532]: https://github.com/tokio-rs/axum/pull/1532 +[#1539]: https://github.com/tokio-rs/axum/pull/1539 [#1552]: https://github.com/tokio-rs/axum/pull/1552 +[`axum-macros`]: https://docs.rs/axum-macros/latest/axum_macros/ + +
+0.6.0 Pre-Releases # 0.6.0-rc.5 (18. November, 2022) @@ -527,6 +933,8 @@ Yanked, as it didn't compile in release mode. [#1302]: https://github.com/tokio-rs/axum/pull/1302 [#924]: https://github.com/tokio-rs/axum/pull/924 +
+ # 0.5.16 (10. September, 2022) ## Security From 181520b4497ed3e36d071dbf8b745d8788d0468d Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 10:18:45 +0100 Subject: [PATCH 2/7] bump versions --- axum-core/Cargo.toml | 4 ++-- axum-core/src/extract/default_body_limit.rs | 12 ++++++------ axum-core/src/extract/mod.rs | 4 ++-- axum-extra/Cargo.toml | 8 ++++---- axum-macros/Cargo.toml | 6 +++--- axum/Cargo.toml | 6 +++--- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/axum-core/Cargo.toml b/axum-core/Cargo.toml index dbe5346cf1..338f5f17de 100644 --- a/axum-core/Cargo.toml +++ b/axum-core/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT" name = "axum-core" readme = "README.md" repository = "https://github.com/tokio-rs/axum" -version = "0.3.0-rc.3" # remember to also bump the version that axum depends on +version = "0.3.0" # remember to also bump the version that axum depends on [dependencies] async-trait = "0.1" @@ -25,7 +25,7 @@ tower-service = "0.3" rustversion = "1.0.9" [dev-dependencies] -axum = { path = "../axum", version = "0.6.0-rc.2" } +axum = { path = "../axum", version = "0.6.0" } futures-util = "0.3" hyper = "0.14" tokio = { version = "1.0", features = ["macros"] } diff --git a/axum-core/src/extract/default_body_limit.rs b/axum-core/src/extract/default_body_limit.rs index 14c155aba4..48ed5a7b75 100644 --- a/axum-core/src/extract/default_body_limit.rs +++ b/axum-core/src/extract/default_body_limit.rs @@ -66,8 +66,8 @@ use tower_layer::Layer; /// /// [`Body::data`]: http_body::Body::data /// [`Bytes`]: bytes::Bytes -/// [`Json`]: https://docs.rs/axum/0.6.0-rc.2/axum/struct.Json.html -/// [`Form`]: https://docs.rs/axum/0.6.0-rc.2/axum/struct.Form.html +/// [`Json`]: https://docs.rs/axum/0.6.0/axum/struct.Json.html +/// [`Form`]: https://docs.rs/axum/0.6.0/axum/struct.Form.html /// [`FromRequest`]: crate::extract::FromRequest /// [`RequestBodyLimit`]: https://docs.rs/tower-http/latest/tower_http/limit/struct.RequestBodyLimit.html /// [`RequestExt::with_limited_body`]: crate::RequestExt::with_limited_body @@ -114,8 +114,8 @@ impl DefaultBodyLimit { /// /// [`tower_http::limit`]: https://docs.rs/tower-http/0.3.4/tower_http/limit/index.html /// [`Bytes`]: bytes::Bytes - /// [`Json`]: https://docs.rs/axum/0.6.0-rc.2/axum/struct.Json.html - /// [`Form`]: https://docs.rs/axum/0.6.0-rc.2/axum/struct.Form.html + /// [`Json`]: https://docs.rs/axum/0.6.0/axum/struct.Json.html + /// [`Form`]: https://docs.rs/axum/0.6.0/axum/struct.Form.html pub fn disable() -> Self { Self { kind: DefaultBodyLimitKind::Disable, @@ -147,8 +147,8 @@ impl DefaultBodyLimit { /// ``` /// /// [`Bytes::from_request`]: bytes::Bytes - /// [`Json`]: https://docs.rs/axum/0.6.0-rc.2/axum/struct.Json.html - /// [`Form`]: https://docs.rs/axum/0.6.0-rc.2/axum/struct.Form.html + /// [`Json`]: https://docs.rs/axum/0.6.0/axum/struct.Json.html + /// [`Form`]: https://docs.rs/axum/0.6.0/axum/struct.Form.html pub fn max(limit: usize) -> Self { Self { kind: DefaultBodyLimitKind::Limit(limit), diff --git a/axum-core/src/extract/mod.rs b/axum-core/src/extract/mod.rs index 537f347635..aec7d37ef7 100644 --- a/axum-core/src/extract/mod.rs +++ b/axum-core/src/extract/mod.rs @@ -37,7 +37,7 @@ mod private { /// /// See [`axum::extract`] for more general docs about extraxtors. /// -/// [`axum::extract`]: https://docs.rs/axum/0.6.0-rc.2/axum/extract/index.html +/// [`axum::extract`]: https://docs.rs/axum/0.6.0/axum/extract/index.html #[async_trait] #[cfg_attr( nightly_error_messages, @@ -106,7 +106,7 @@ pub trait FromRequestParts: Sized { /// This ensures your extractor is as flexible as possible. /// /// [`http::Request`]: http::Request -/// [`axum::extract`]: https://docs.rs/axum/0.6.0-rc.2/axum/extract/index.html +/// [`axum::extract`]: https://docs.rs/axum/0.6.0/axum/extract/index.html #[async_trait] #[cfg_attr( nightly_error_messages, diff --git a/axum-extra/Cargo.toml b/axum-extra/Cargo.toml index cd50a52e9e..5a985a5a4b 100644 --- a/axum-extra/Cargo.toml +++ b/axum-extra/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT" name = "axum-extra" readme = "README.md" repository = "https://github.com/tokio-rs/axum" -version = "0.4.0-rc.3" +version = "0.4.0" [features] default = [] @@ -35,7 +35,7 @@ spa = ["tower-http/fs"] typed-routing = ["dep:axum-macros", "dep:serde", "dep:percent-encoding"] [dependencies] -axum = { path = "../axum", version = "=0.6.0-rc.5", default-features = false } +axum = { path = "../axum", version = "0.6.0", default-features = false } bytes = "1.1.0" futures-util = { version = "0.3", default-features = false, features = ["alloc"] } http = "0.2" @@ -48,7 +48,7 @@ tower-layer = "0.3" tower-service = "0.3" # optional dependencies -axum-macros = { path = "../axum-macros", version = "=0.3.0-rc.3", optional = true } +axum-macros = { path = "../axum-macros", version = "0.3.0", optional = true } cookie = { package = "cookie", version = "0.16", features = ["percent-encode"], optional = true } percent-encoding = { version = "2.1", optional = true } prost = { version = "0.11", optional = true } @@ -59,7 +59,7 @@ tokio-stream = { version = "0.1.9", optional = true } tokio-util = { version = "0.7", optional = true } [dev-dependencies] -axum = { path = "../axum", version = "=0.6.0-rc.5", features = ["headers"] } +axum = { path = "../axum", version = "0.6.0", features = ["headers"] } futures = "0.3" hyper = "0.14" reqwest = { version = "0.11", default-features = false, features = ["json", "stream", "multipart"] } diff --git a/axum-macros/Cargo.toml b/axum-macros/Cargo.toml index 68ba8c1ceb..848354de88 100644 --- a/axum-macros/Cargo.toml +++ b/axum-macros/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT" name = "axum-macros" readme = "README.md" repository = "https://github.com/tokio-rs/axum" -version = "0.3.0-rc.3" # remember to also bump the version that axum and axum-extra depends on +version = "0.3.0" # remember to also bump the version that axum and axum-extra depends on [lib] proc-macro = true @@ -25,8 +25,8 @@ syn = { version = "1.0", features = [ ] } [dev-dependencies] -axum = { path = "../axum", version = "=0.6.0-rc.5", features = ["headers", "macros"] } -axum-extra = { path = "../axum-extra", version = "=0.4.0-rc.3", features = ["typed-routing", "cookie-private"] } +axum = { path = "../axum", version = "0.6.0", features = ["headers", "macros"] } +axum-extra = { path = "../axum-extra", version = "0.4.0", features = ["typed-routing", "cookie-private"] } rustversion = "1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/axum/Cargo.toml b/axum/Cargo.toml index 06d73f045a..1d32a13ddb 100644 --- a/axum/Cargo.toml +++ b/axum/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "axum" -version = "0.6.0-rc.5" +version = "0.6.0" categories = ["asynchronous", "network-programming", "web-programming::http-server"] description = "Web framework that focuses on ergonomics and modularity" edition = "2021" @@ -31,7 +31,7 @@ __private_docs = ["tower/full", "tower-http/full"] [dependencies] async-trait = "0.1.43" -axum-core = { path = "../axum-core", version = "=0.3.0-rc.3" } +axum-core = { path = "../axum-core", version = "0.3.0" } bitflags = "1.0" bytes = "1.0" futures-util = { version = "0.3", default-features = false, features = ["alloc"] } @@ -52,7 +52,7 @@ tower-layer = "0.3.2" tower-service = "0.3" # optional dependencies -axum-macros = { path = "../axum-macros", version = "=0.3.0-rc.3", optional = true } +axum-macros = { path = "../axum-macros", version = "0.3.0", optional = true } base64 = { version = "0.13", optional = true } headers = { version = "0.3.7", optional = true } multer = { version = "2.0.0", optional = true } From 5f842a164f8d37c476974593159b7a0237731147 Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 10:28:55 +0100 Subject: [PATCH 3/7] reorder changelogs a bit --- axum-core/CHANGELOG.md | 4 +-- axum-extra/CHANGELOG.md | 22 +++++++------- axum-macros/CHANGELOG.md | 6 ++-- axum/CHANGELOG.md | 66 ++++++++++++++++++++-------------------- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/axum-core/CHANGELOG.md b/axum-core/CHANGELOG.md index 1ac82cfa6a..f46ad4cb9e 100644 --- a/axum-core/CHANGELOG.md +++ b/axum-core/CHANGELOG.md @@ -11,10 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # 0.3.0 (25. November, 2022) -- **breaking:** `FromRequest` has been reworked and `RequestParts` has been - removed. See axum's changelog for more details ([#1272]) - **added:** Added new `FromRequestParts` trait. See axum's changelog for more details ([#1272]) +- **breaking:** `FromRequest` has been reworked and `RequestParts` has been + removed. See axum's changelog for more details ([#1272]) - **breaking:** `BodyAlreadyExtracted` has been removed ([#1272]) - **breaking:** `AppendHeaders` now works on any `impl IntoIterator` ([#1495]) diff --git a/axum-extra/CHANGELOG.md b/axum-extra/CHANGELOG.md index a61931d0b5..01addedb44 100644 --- a/axum-extra/CHANGELOG.md +++ b/axum-extra/CHANGELOG.md @@ -11,26 +11,26 @@ and this project adheres to [Semantic Versioning]. # 0.4.0 (25. November, 2022) -- **breaking:** `Form` has a new rejection type ([#1496]) -- **breaking:** `Query` has a new rejection type ([#1496]) - **added:** Add `RouterExt::route_with_tsr` for adding routes with an additional "trailing slash redirect" route ([#1119]) -- **breaking:** `Resource::nest` and `Resource::nest_collection` has been - removed. You can instead convert the `Resource` into a `Router` and - add additional routes as necessary ([#1086]) -- **changed:** For methods that accept some `S: Service`, the bounds have been - relaxed so the response type must implement `IntoResponse` rather than being a - literal `Response` - **added:** Support chaining handlers with `HandlerCallWithExtractors::or` ([#1170]) -- **change:** axum-extra's MSRV is now 1.60 ([#1239]) -- **breaking:** `SignedCookieJar` and `PrivateCookieJar` now extracts the keys - from the router's state, rather than extensions - **added:** Add Protocol Buffer extractor and response ([#1239]) - **added:** Add `Either*` types for combining extractors and responses into a single type ([#1263]) - **added:** `WithRejection` extractor for customizing other extractors' rejections ([#1262]) - **added:** Add sync constructors to `CookieJar`, `PrivateCookieJar`, and `SignedCookieJar` so they're easier to use in custom middleware +- **changed:** For methods that accept some `S: Service`, the bounds have been + relaxed so the response type must implement `IntoResponse` rather than being a + literal `Response` +- **change:** axum-extra's MSRV is now 1.60 ([#1239]) +- **breaking:** `Form` has a new rejection type ([#1496]) +- **breaking:** `Query` has a new rejection type ([#1496]) +- **breaking:** `Resource::nest` and `Resource::nest_collection` has been + removed. You can instead convert the `Resource` into a `Router` and + add additional routes as necessary ([#1086]) +- **breaking:** `SignedCookieJar` and `PrivateCookieJar` now extracts the keys + from the router's state, rather than extensions - **breaking:** `Resource` has a new `S` type param which represents the state ([#1155]) - **breaking:** `RouterExt::route_with_tsr` now only accepts `MethodRouter`s ([#1155]) - **added:** `RouterExt::route_service_with_tsr` for routing to any `Service` ([#1155]) diff --git a/axum-macros/CHANGELOG.md b/axum-macros/CHANGELOG.md index e4cba573a5..f80dd9d9e8 100644 --- a/axum-macros/CHANGELOG.md +++ b/axum-macros/CHANGELOG.md @@ -11,17 +11,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 # 0.3.0 (25. November, 2022) +- **added:** Add `#[derive(FromRequestParts)]` for deriving an implementation of + `FromRequestParts`, similarly to `#[derive(FromRequest)]` ([#1305]) - **added:** Add `#[derive(FromRef)]` ([#1430]) - **added:** Add `#[from_ref(skip)]` to skip implementing `FromRef` for individual fields ([#1537]) - **added:** Support using a different rejection for `#[derive(FromRequest)]` with `#[from_request(rejection(MyRejection))]` ([#1256]) +- **change:** axum-macro's MSRV is now 1.60 ([#1239]) - **breaking:** `#[derive(FromRequest)]` will no longer generate a rejection enum but instead generate `type Rejection = axum::response::Response`. Use the new `#[from_request(rejection(MyRejection))]` attribute to change this. The `rejection_derive` attribute has also been removed ([#1272]) -- **added:** Add `#[derive(FromRequestParts)]` for deriving an implementation of - `FromRequestParts`, similarly to `#[derive(FromRequest)]` ([#1305]) -- **change:** axum-macro's MSRV is now 1.60 ([#1239]) [#1239]: https://github.com/tokio-rs/axum/pull/1239 [#1256]: https://github.com/tokio-rs/axum/pull/1256 diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index d9f58c43f0..090829b9fb 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -122,6 +122,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 async fn fallback() {} ``` +- **changed:** `Router::nest` now only accepts `Router`s, the general-purpose + `Service` nesting method has been renamed to `nest_service` ([#1368]) - **breaking:** Allow `Error: Into` for `Route::{layer, route_layer}` ([#924]) - **breaking:** `MethodRouter` now panics on overlapping routes ([#1102]) - **breaking:** `Router::route` now only accepts `MethodRouter`s created with @@ -130,8 +132,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **breaking:** Adding a `.route_layer` onto a `Router` or `MethodRouter` without any routes will now result in a panic. Previously, this just did nothing. [#1327] -- **changed:** `Router::nest` now only accepts `Router`s, the general-purpose - `Service` nesting method has been renamed to `nest_service` ([#1368]) - **breaking:** `RouterService` has been removed since `Router` now implements `Service` when the state is `()`. Use `Router::with_state` to provide the state and get a `Router<()>`. Note that `RouterService` only existed in the @@ -303,6 +303,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 } ``` +- **added:** `FromRequest` and `FromRequestParts` derive macro re-exports from + [`axum-macros`] behind the `macros` feature ([#1352]) +- **added:** Add `RequestExt` and `RequestPartsExt` which adds convenience + methods for running extractors to `http::Request` and `http::request::Parts` ([#1301]) +- **added**: `JsonRejection` now displays the path at which a deserialization + error occurred ([#1371]) +- **added:** Add `extract::RawForm` for accessing raw urlencoded query bytes or request body ([#1487]) +- **fixed:** Used `400 Bad Request` for `FailedToDeserializeQueryString` + rejections, instead of `422 Unprocessable Entity` ([#1387]) +- **changed**: The inner error of a `JsonRejection` is now + `serde_path_to_error::Error`. Previously it was + `serde_json::Error` ([#1371]) +- **changed:** The default body limit now applies to the `Multipart` extractor ([#1420]) +- **breaking:** `ContentLengthLimit` has been removed. Use `DefaultBodyLimit` instead ([#1400]) - **breaking:** `RequestParts` has been removed as part of the `FromRequest` rework ([#1272]) - **breaking:** `BodyAlreadyExtracted` has been removed ([#1272]) @@ -312,35 +326,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `MethodRouter`, defaults to `()` - `FromRequest`, no default - `Handler`, no default -- **added:** Add `RequestExt` and `RequestPartsExt` which adds convenience - methods for running extractors to `http::Request` and `http::request::Parts` ([#1301]) -- **changed**: The inner error of a `JsonRejection` is now - `serde_path_to_error::Error`. Previously it was - `serde_json::Error` ([#1371]) -- **added**: `JsonRejection` now displays the path at which a deserialization - error occurred ([#1371]) -- **fixed:** Used `400 Bad Request` for `FailedToDeserializeQueryString` - rejections, instead of `422 Unprocessable Entity` ([#1387]) -- **breaking:** `ContentLengthLimit` has been removed. Use `DefaultBodyLimit` instead ([#1400]) -- **changed:** The default body limit now applies to the `Multipart` extractor ([#1420]) -- **added:** `FromRequest` and `FromRequestParts` derive macro re-exports from - [`axum-macros`] behind the `macros` feature ([#1352]) - **breaking:** `MatchedPath` can now no longer be extracted in middleware for nested routes. In previous versions it returned invalid data when extracted from a middleware applied to a nested router. `MatchedPath` can still be extracted from handlers and middleware that aren't on nested routers ([#1462]) -- **added:** Add `extract::RawForm` for accessing raw urlencoded query bytes or request body ([#1487]) - **breaking:** Rename `FormRejection::FailedToDeserializeQueryString` to `FormRejection::FailedToDeserializeForm` ([#1496]) ## Middleware -- **breaking:** Remove `extractor_middleware` which was previously deprecated. - Use `axum::middleware::from_extractor` instead ([#1077]) - **added:** Support running extractors on `middleware::from_fn` functions ([#1088]) -- **added:** Support any middleware response that implements `IntoResponse` ([#1152]) -- **breaking:** Require middleware added with `Handler::layer` to have - `Infallible` as the error type ([#1152]) - **added**: Add `middleware::from_fn_with_state` and `middleware::from_fn_with_state_arc` to enable running extractors that require state ([#1342]) @@ -349,31 +344,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 request with an async function ([#1408]) - **added:** Add `map_response`, `map_response_with_state` for transforming the response with an async function ([#1414]) +- **added:** Support any middleware response that implements `IntoResponse` ([#1152]) +- **breaking:** Remove `extractor_middleware` which was previously deprecated. + Use `axum::middleware::from_extractor` instead ([#1077]) +- **breaking:** Require middleware added with `Handler::layer` to have + `Infallible` as the error type ([#1152]) ## Misc -- **changed:** axum's MSRV is now 1.60 ([#1239]) -- **breaking:** New `tokio` default feature needed for WASM support. If you - don't need WASM support but have `default_features = false` for other reasons - you likely need to re-enable the `tokio` feature ([#1382]) - **added:** Support compiling to WASM. See the `simple-router-wasm` example for more details ([#1382]) -- **changed:** For methods that accept some `S: Service`, the bounds have been - relaxed so the response type must implement `IntoResponse` rather than being a - literal `Response` -- **fixed:** Annotate panicking functions with `#[track_caller]` so the error - message points to where the user added the invalid route, rather than - somewhere internally in axum ([#1248]) - **added:** Add `ServiceExt` with methods for turning any `Service` into a `MakeService` similarly to `Router::into_make_service` ([#1302]) -- **breaking:** `handler::{WithState, IntoService}` are merged into one type, - named `HandlerService` ([#1418]) - **added:** String and binary `From` impls have been added to `extract::ws::Message` to be more inline with `tungstenite` ([#1421]) - **added:** Add `#[derive(axum::extract::FromRef)]` ([#1430]) - **added:** Add `accept_unmasked_frames` setting in WebSocketUpgrade ([#1529]) - **added:** Add `WebSocketUpgrade::on_failed_upgrade` to customize what to do when upgrading a connection fails ([#1539]) +- **fixed:** Annotate panicking functions with `#[track_caller]` so the error + message points to where the user added the invalid route, rather than + somewhere internally in axum ([#1248]) +- **changed:** axum's MSRV is now 1.60 ([#1239]) +- **changed:** For methods that accept some `S: Service`, the bounds have been + relaxed so the response type must implement `IntoResponse` rather than being a + literal `Response` +- **breaking:** New `tokio` default feature needed for WASM support. If you + don't need WASM support but have `default_features = false` for other reasons + you likely need to re-enable the `tokio` feature ([#1382]) +- **breaking:** `handler::{WithState, IntoService}` are merged into one type, + named `HandlerService` ([#1418]) [#924]: https://github.com/tokio-rs/axum/pull/924 [#1077]: https://github.com/tokio-rs/axum/pull/1077 From 61c9d3e6532df10de158c25be749bc51299c60d9 Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 13:05:46 +0100 Subject: [PATCH 4/7] Apply suggestions from code review Co-authored-by: Jonas Platte --- axum-extra/CHANGELOG.md | 4 ++-- axum/CHANGELOG.md | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/axum-extra/CHANGELOG.md b/axum-extra/CHANGELOG.md index 01addedb44..ec8eb03f9a 100644 --- a/axum-extra/CHANGELOG.md +++ b/axum-extra/CHANGELOG.md @@ -21,12 +21,12 @@ and this project adheres to [Semantic Versioning]. - **added:** Add sync constructors to `CookieJar`, `PrivateCookieJar`, and `SignedCookieJar` so they're easier to use in custom middleware - **changed:** For methods that accept some `S: Service`, the bounds have been - relaxed so the response type must implement `IntoResponse` rather than being a + relaxed so the return type can be any type that implements `IntoResponse` rather than being a literal `Response` - **change:** axum-extra's MSRV is now 1.60 ([#1239]) - **breaking:** `Form` has a new rejection type ([#1496]) - **breaking:** `Query` has a new rejection type ([#1496]) -- **breaking:** `Resource::nest` and `Resource::nest_collection` has been +- **breaking:** `Resource::nest` and `Resource::nest_collection` have been removed. You can instead convert the `Resource` into a `Router` and add additional routes as necessary ([#1086]) - **breaking:** `SignedCookieJar` and `PrivateCookieJar` now extracts the keys diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index 090829b9fb..ba64f7dd0b 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -99,7 +99,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ``` - **breaking:** `Router::fallback` now only accepts `Handler`s (similarly to - what `get`, `post`, etc accept). Use the new `Router::fallback_service` for + what `get`, `post`, etc. accept). Use the new `Router::fallback_service` for setting any `Service` as the fallback ([#1155]) This fallback on 0.5: @@ -143,7 +143,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `Router::with_state` and gives compile errors for missing states, whereas `Extension` would result in runtime errors ([#1155]) - We recommend migrating from `Extension` to `State` since that is more type + We recommend migrating from `Extension` to `State` for sharing application state since that is more type safe and faster. That is done by using `Router::with_state` and `State`. This setup in 0.5 @@ -176,7 +176,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 struct AppState {} ``` - If you have multiple extensions you can use fields on `AppState` and implement + If you have multiple extensions, you can use fields on `AppState` and implement `FromRef`: ```rust @@ -336,8 +336,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Middleware - **added:** Support running extractors on `middleware::from_fn` functions ([#1088]) -- **added**: Add `middleware::from_fn_with_state` and - `middleware::from_fn_with_state_arc` to enable running extractors that require +- **added**: Add `middleware::from_fn_with_state` to enable running extractors that require state ([#1342]) - **added:** Add `middleware::from_extractor_with_state` ([#1396]) - **added:** Add `map_request`, `map_request_with_state` for transforming the From 3c97fc1d7eaafc344967c00bc02f37dce175e79f Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 13:15:03 +0100 Subject: [PATCH 5/7] Expand fallback inheritance --- axum/CHANGELOG.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index ba64f7dd0b..dd5323519d 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -13,8 +13,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Routing -- **fixed:** Nested routers will now inherit fallbacks from outer routers - unless they define their own fallback ([#1521]) +- **fixed:** Nested routers are now allowed to have fallbacks ([#1521]): + + ```rust + let api_router = Router::new() + .route("/users", get(|| { ... })) + .fallback(api_fallback); + + let app = Router::new() + // this would panic in 0.5 but in 0.6 it just works + // + // requests starting with `/api` but not handled by `api_router` + // will go to `/api_fallback` + .nest("/api", api_router); + ``` + + The outer router's fallback will still apply if a nested router doesn't have + its own fallback: + + ```rust + // this time without a fallback + let api_router = Router::new().route("/users", get(|| { ... })); + + let app = Router::new() + .nest("/api", api_router) + // `api_fallback` will inherit this fallback + .fallback(app_fallback); + ``` + - **breaking:** The request `/foo/` no longer matches `/foo/*rest`. If you want to match `/foo/` you have to add a route specifically for that ([#1086]) From 2b04e54401decc6ac3e1f9163bbe087b698ecbdc Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 13:17:33 +0100 Subject: [PATCH 6/7] Reword tsr --- axum/CHANGELOG.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index dd5323519d..a41fe5963a 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -101,14 +101,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 async fn bar() {} ``` -- **breaking:** Trailing slash redirects have been removed. Previously if you - added a route for `/foo`, axum would redirect calls to `/foo/` to `/foo` (or - vice versa for `/foo/`). That is no longer supported and such requests will - now be sent to the fallback. Consider using - `axum_extra::routing::RouterExt::route_with_tsr` if you want the old behavior - ([#1119]) - - For example: +- **breaking:** Automatic trailing slash redirects have been removed. + Previously if you added a route for `/foo`, axum would redirect calls to + `/foo/` to `/foo` (or vice versa for `/foo/`): ```rust use axum::{Router, routing::get}; @@ -124,6 +119,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 async fn handler() {} ``` + Either explicitly add routes for `/foo` and `/foo/` or use + `axum_extra::routing::RouterExt::route_with_tsr` if you want the old behavior + ([#1119]) + - **breaking:** `Router::fallback` now only accepts `Handler`s (similarly to what `get`, `post`, etc. accept). Use the new `Router::fallback_service` for setting any `Service` as the fallback ([#1155]) From 782b63108792f53cff75afbcc9337eb8d1b04595 Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Fri, 25 Nov 2022 13:22:15 +0100 Subject: [PATCH 7/7] Mention `parse-body-based-on-content-type` example --- axum/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index a41fe5963a..077ddd928a 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -328,6 +328,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 } ``` + For an example of how to write an extractor that accepts different + `Content-Types` see the [`parse-body-based-on-content-type`] example. + - **added:** `FromRequest` and `FromRequestParts` derive macro re-exports from [`axum-macros`] behind the `macros` feature ([#1352]) - **added:** Add `RequestExt` and `RequestPartsExt` which adds convenience @@ -439,6 +442,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#1539]: https://github.com/tokio-rs/axum/pull/1539 [#1552]: https://github.com/tokio-rs/axum/pull/1552 [`axum-macros`]: https://docs.rs/axum-macros/latest/axum_macros/ +[`parse-body-based-on-content-type`]: https://github.com/tokio-rs/axum/blob/main/examples/parse-body-based-on-content-type/src/main.rs
0.6.0 Pre-Releases