axum-extra
Extra utilities for axum
0.12.6
45M downloads/mo
#1299 most downloaded on crates.io
tokio-rs/axum
What this package is like to depend on
Last release 4 months ago
14 Apr 2026
Release timing varies
gaps range from 2 weeks to 6 months
Nearly every release is documented
notes for 47 of 47 stable releases
2 versions withdrawn
withdrawn after publishing
5 years old
54 releases · first in 2021
9 releases in the last 12 months
see the full history below
Release timeline
54 releases · Dec 2021 to Apr 2026Releases
latest 54-
0.12.614 Apr 2026Release notes
Open source →- fixed: Escape backslashes and double quotes in
Content-Dispositionfilenames to prevent header parameter injection inAttachmentandFileStream(#3664) vpath!macro now stops the compilation if your path is using deprecated path variables in the old107format, such as:varand*var. the only allowed way now is{var}. (#3618)- fixed: Return specific error message when multipart body limit is exceeded (#3611)
Release notes
Open source →- fixed: Escape backslashes and double quotes in
Content-Dispositionfilenames to prevent header parameter injection inAttachmentandFileStream(#3664) vpath!macro now stops the compilation if your path is using deprecated path variables in the old107format, such as:varand*var. the only allowed way now is{var}. (#3618)- fixed: Return specific error message when multipart body limit is exceeded (#3611)
- fixed: Escape backslashes and double quotes in
-
0.12.527 Dec 2025 -
0.12.427 Dec 2025 -
0.12.320 Dec 2025 -
0.12.214 Nov 2025 -
0.12.102 Nov 2025Release notes
Open source →This release contains no changes in code, only a small
Cargo.tomlfix fordocs.rs. -
0.12.031 Oct 2025Release notes
Open source →- breaking: Remove unused
async-streamfeature, which was accidentally introduced as an implicit feature through an optional dependency which was no longer being used (#3298) - breaking:
option_layernow maps theResponsebody type toaxum::body::Body(#3469) - breaking: Some new features are added which need to be opted in (#3485).
Cachedextractor requirescachedfeature.- The handler utilities require
handlerfeature. - The middleware utilities require
middlewarefeature. OptionalPathextractor requiresoptional-pathfeature.- The routing utilities require
routingfeature. WithRejectionextractor requireswith-rejectionfeature.
- breaking: Upgraded
prostdependency to v0.14. (#3517)
- breaking: Remove unused
-
0.11.021 Jan 2025 withdrawnRelease notes
Open source →Yanked from crates.io due to unforeseen breaking change, see #3190 for details.
-
0.10.330 Sep 2025 -
0.10.228 Sep 2025 -
0.10.128 Mar 2025 -
0.10.001 Jan 2025Release notes
Open source →since rc.1
<details>
- breaking: Remove
OptionalFromRequestPartsimpl forQuery(#3088) - changed: Query/Form: Use
serde_path_to_errorto report fields that failed to parse (#3081)
</details>
full changelog
- breaking: Update to prost 0.13. Used for the
Protobufextractor (#2829) - changed: Update minimum rust version to 1.75 (#2943)
- changed: Deprecated
OptionalPath<T>(#2475) - changed: Query/Form: Use
serde_path_to_errorto report fields that failed to parse (#3081) - changed: The
multipartfeature is no longer on by default (#3058) - fixed:
Hostextractor includes port number when parsing authority (#2242) - added: Add
RouterExt::typed_connect(#2961) - added: Add
json!for easy construction of JSON responses (#2962) - added: Add
InternalServerErrorresponse for logging an internal error and returning HTTP 500 in a convenient way. (#3010) - added: Add
FileStreamfor easy construction of file stream responses (#3047) - added: Add
Schemeextractor (#2507)
rc.1
- breaking:
Option<Query<T>>no longer swallows all error conditions, instead rejecting the request in many cases; see its documentation for details (#2475) - changed: Deprecated
OptionalPath<T>andOptionalQuery<T>(#2475) - fixed:
Hostextractor includes port number when parsing authority (#2242) - changed: The
multipartfeature is no longer on by default (#3058) - added: Add
RouterExt::typed_connect(#2961) - added: Add
json!for easy construction of JSON responses (#2962) - added: Add
InternalServerErrorresponse for logging an internal error and returning HTTP 500 in a convenient way. (#3010) - added: Add
FileStreamfor easy construction of file stream responses (#3047) - added: Add
Schemeextractor (#2507)
alpha.1
- breaking: Remove
-
0.10.0-rc.117 Dec 2024 pre-releaseNothing published for this version
-
0.10.0-alpha.105 Oct 2024 pre-releaseNothing published for this version
-
0.9.616 Nov 2024 -
0.9.515 Nov 2024 -
0.9.420 Sep 2024 -
0.9.324 Mar 2024Release notes
Open source →- added: New
tracingfeature which enables logging rejections from built-in extractor with theaxum::rejection=tracetarget (#2584)
- added: New
-
0.9.213 Jan 2024 -
0.9.129 Dec 2023 -
0.9.027 Nov 2023Release notes
Open source →- added:
OptionalQueryextractor (#2310) - added:
TypedHeaderwhich used to be inaxum(#1850) - breaking: Update to prost 0.12. Used for the
Protobufextractor - breaking: Make
tokioan optional dependency - breaking: Upgrade
cookiedependency to 0.18 (#2343) - breaking: Functions and methods that previously accepted a
Cookienow accept anyT: Into<Cookie>(#2348)
- added:
-
0.8.016 Sep 2023 -
0.7.703 Aug 2023 -
0.7.602 Aug 2023 -
0.7.517 Jul 2023 -
0.7.418 Apr 2023 -
0.7.311 Apr 2023 -
0.7.222 Mar 2023 -
0.7.113 Mar 2023 -
0.7.003 Mar 2023Release notes
Open source →- breaking: Remove the
spafeature which should have been removed in 0.6.0 (#1802) - added: Add
Multipart. This is similar toaxum::extract::Multipartexcept that it enforces field exclusivity at runtime instead of compile time, as this improves usability (#1692) - added: Implement
CloneforCookieJar,PrivateCookieJarandSignedCookieJar(#1808) - fixed: Add
#[must_use]attributes to types that do nothing unless used (#1809)
- breaking: Remove the
-
0.6.027 Feb 2023Release notes
Open source →-
breaking: Change casing of
ProtoBuftoProtobuf(#1595) -
breaking:
SpaRouterhas been removed. UseServeDirandServeFilefromtower-httpinstead:// before Router::new().merge(SpaRouter::new("/assets", "dist")); // with ServeDir Router::new().nest_service("/assets", ServeDir::new("dist")); // before with `index_file` Router::new().merge(SpaRouter::new("/assets", "dist").index_file("index.html")); // with ServeDir + ServeFile Router::new().nest_service( "/assets", ServeDir::new("dist").not_found_service(ServeFile::new("dist/index.html")), );See the static-file-server-example for more examples (#1784)
-
-
0.5.012 Feb 2023 -
0.4.202 Dec 2022Release notes
Open source →- fixed: Bug fixes for
RouterExt:{route_with_tsr, route_service_with_tsr}(#1608):- Redirects to the correct URI if the route contains path parameters
- Keeps query parameters when redirecting
- Better improved error message if adding route for
/
- fixed: Bug fixes for
-
0.4.129 Nov 2022 -
0.4.025 Nov 2022Release notes
Open source →- added: Add
RouterExt::route_with_tsrfor adding routes with an additional "trailing slash redirect" route (#1119) - added: Support chaining handlers with
HandlerCallWithExtractors::or(#1170) - added: Add Protocol Buffer extractor and response (#1239)
- added: Add
Either*types for combining extractors and responses into a single type (#1263) - added:
WithRejectionextractor for customizing other extractors' rejections (#1262) - added: Add sync constructors to
CookieJar,PrivateCookieJar, andSignedCookieJarso they're easier to use in custom middleware - changed: For methods that accept some
S: Service, the bounds have been relaxed so the return type can be any type that implementsIntoResponserather than being a literalResponse - change: axum-extra's MSRV is now 1.60 (#1239)
- breaking:
Formhas a new rejection type (#1496) - breaking:
Queryhas a new rejection type (#1496) - breaking:
Resource::nestandResource::nest_collectionhave been removed. You can instead convert theResourceinto aRouterand add additional routes as necessary (#1086) - breaking:
SignedCookieJarandPrivateCookieJarnow extracts the keys from the router's state, rather than extensions - breaking:
Resourcehas a newStype param which represents the state (#1155) - breaking:
RouterExt::route_with_tsrnow only acceptsMethodRouters (#1155) - added:
RouterExt::route_service_with_tsrfor routing to anyService(#1155)
<details> <summary>0.4.0 Pre-Releases</summary>
- added: Add
-
0.4.0-rc.319 Nov 2022 pre-release -
0.4.0-rc.209 Nov 2022 pre-releaseRelease notes
Open source → -
0.4.0-rc.123 Aug 2022 pre-releaseRelease notes
Open source →- added: Add
RouterExt::route_with_tsrfor adding routes with an additional "trailing slash redirect" route (#1119) - breaking:
Resource::nestandResource::nest_collectionhas been removed. You can instead convert theResourceinto aRouterand add additional routes as necessary (#1086) - changed: For methods that accept some
S: Service, the bounds have been relaxed so the response type must implementIntoResponserather than being a literalResponse - added: Support chaining handlers with
HandlerCallWithExtractors::or(#1170) - change: axum-extra's MSRV is now 1.60 (#1239)
- breaking:
SignedCookieJarandPrivateCookieJarnow 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:
WithRejectionextractor for customizing other extractors' rejections (#1262) - added: Add sync constructors to
CookieJar,PrivateCookieJar, andSignedCookieJarso they're easier to use in custom middleware - breaking:
Resourcehas a newStype param which represents the state (#1155) - breaking:
RouterExt::route_with_tsrnow only acceptsMethodRouters (#1155) - added:
RouterExt::route_service_with_tsrfor routing to anyService(#1155)
</details>
- added: Add
-
0.3.709 Aug 2022Release notes
Open source →- fixed: Depend on axum 0.5.15 which contains a fix for an accidental breaking change.
-
0.3.602 Jul 2022 -
0.3.527 Jun 2022 -
0.3.408 Jun 2022 -
0.3.318 May 2022 -
0.3.215 May 2022 -
0.3.110 May 2022 -
0.3.027 Apr 2022 -
0.2.103 Apr 2022 -
0.2.031 Mar 2022Release notes
Open source →- added: Add
TypedPath::to_urifor converting the path into aUri(#790) - added: Extractors and responses for dealing with cookies. See
extract::cookiesfor more details (#816) - breaking:
CachedRejectionhas been removed (#699) - breaking:
<Cached<T> as FromRequest>::Rejectionis nowT::Rejection. (#699) - breaking:
middleware::from_fnhas been remove from axum-extra and moved into the main axum crate (#719) - breaking:
HasRouteshas been removed.Router::mergenow acceptsInto<Router>(#819) - breaking:
RouterExt::withmethod has been removed. UseRouter::mergeinstead. It works identically (#819)
- added: Add
-
0.1.501 Mar 2022 -
0.1.422 Feb 2022 -
0.1.322 Feb 2022 withdrawn -
0.1.213 Jan 2022 -
0.1.127 Dec 2021 -
0.1.002 Dec 2021