Commit Graph
454 Commits
Author SHA1 Message Date
Kai Jewson decdd4c948 Avoid double-boxing bodies where possible (#569)
* Avoid double-boxing bodies where possible

* Extract `try_downcast` to `util` module
2021-11-27 10:20:31 +01:00
David Pedersen 96b353b556 Add Cached extractor (#565)
* extra: Add `Cached` extractor

`Cached` wraps another extractor and caches its result in request
extensions.

* Use newtype to avoid overriding extensions of the same type

* Rename type param
2021-11-25 10:14:31 +00:00
Pure White 5a5800c1ae feat: default to charset=utf-8 for text content type (#554)
* feat: default to charset=utf-8 for text content type

* added changelog && fix comment

* fix workflow
2021-11-25 08:31:30 +00:00
EdorianDark c5a33addb7 Add tower-cookies to ecosystem (#562) 2021-11-24 17:44:34 +01:00
John Teske b5b0c0e491 Update routing layer documentation (#560) 2021-11-24 06:57:29 +00:00
David Pedersen 6d0abd447c axum-debug: Version 0.2.2 (#553)
- Fix regression causing errors when `#[debug_handler]` was used on functions with multiple
  extractors ([#552])

[#552]: https://github.com/tokio-rs/axum/pull/552
axum-debug-v0.2.2
2021-11-22 09:40:35 +00:00
David Pedersen 27e848fbe8 Fix #[debug_handler] for multiple extractors (#552)
* Fix `#[debug_handler]` for multiple extractors

It generated a function for each extractor to check the type but those
functions didn't have unique names.

Fixed by including all idents in the `arg: Extractor` token tree in the
name of the function generated. Not sure there is a simpler way to fix
it.

* just use a counter

* don't need visit feature anymore
2021-11-22 10:28:43 +01:00
Jonas Platte 69fee5864d Use .to_owned() instead of .to_string() to turn &str into String (#548) 2021-11-19 22:15:47 +00:00
David Pedersen ab9f1ef993 Change how Resources are added to Routers (#544) 2021-11-19 21:59:07 +01:00
David Pedersen 44a49cb199 axum-debug: Version 0.2.1 (#545)
- Make macro handle more cases such as mutable extractors and handlers taking
  `self` ([#518])

[#518]: https://github.com/tokio-rs/axum/pull/518
axum-debug-v0.2.1
2021-11-19 20:38:30 +00:00
David Pedersen f1f004a057 Make axum-debug handle more cases (#518)
* Make `axum-debug` handle more cases

* Only just trybuild tests on stable

* revert changes to hello-world example

* Remove a bit of duplication

* return error on generics

* address review feedback

* Support associated functions with receiver or returns `Self`

* fix indentation
2021-11-19 21:32:07 +01:00
David Pedersen 22931688f7 Fix Router::merge for overlapping routes same different methods (#543)
Discovered while working on something else that we didn't properly
handle this:

```rust
let one = Router::new().route("/", get(|| async {}));
let two = Router::new().route("/", post(|| async {}));

let app = one.merge(two);
```
2021-11-19 21:15:41 +01:00
David Pedersen 1d94d75c57 Panic instead of silently discarding fallbacks (#529)
This introduces two new possible panics when constructing routers:

- If merging two routers that each have a fallback. Previously that left
  side fallback would be silently discarded.
- If nesting a router that has a fallback. Previously it would be
  silently discarded.

Overall this should make things more explicit and users shouldn't have
to worry "why isn't my fallback" working.

Fixes #488
2021-11-18 22:19:06 +01:00
David Pedersen badbb14cce Remove CloneBoxService (#542)
Its been [upstreamed to tower](https://github.com/tower-rs/tower/pull/615).
2021-11-18 22:18:45 +01:00
David Pedersen f9a437d081 Add Resource to axum-extra (#538) 2021-11-17 22:31:43 +00:00
Jonas Platte b43b9ed69d Add axum_extra::response::ErasedJson (#537) 2021-11-17 22:54:02 +01:00
David Pedersen a16ea65031 Add axum-extra crate (#536)
* Add `axum-extra` crate

Empty for now but now we have a place to put stuff.

I'll make a PR for moving over https://github.com/davidpdrsn/axum-resource.

* remove `authors` field from `Cargo.toml`s
2021-11-17 20:00:32 +00:00
Jonas Platte 2bfd51372e Use named constants for static header values (#535)
Improves performance by moving some computation to compile time.
2021-11-17 19:53:07 +00:00
David Pedersen 9a410371a6 Move axum-handle-error-extract into axum (#534)
* Move `axum-handle-error-extract` into axum

With 0.4 underway we can now nuke `axum-handle-error-extract` and move
its code directly into axum.

So this replaces the old `HandleErrorLayer` with one that supports async
functions and extractors.

* changelog

* fix CI
2021-11-17 19:09:58 +00:00
David Pedersen a317072467 Rename box_body to body (#533)
Probably would have been easier to merge this change directly into
`main` first and the backport it to `v0.3.x` but here we are :P

Fixes #528
2021-11-17 12:59:29 +00:00
David Pedersen 939995e80e Make the B type parameter in Handler default to axum::body::Body (#527)
* Swap type params in `Handler`

* Default `B` type param in `Handler`
2021-11-16 23:00:39 +01:00
David Pedersen 1dc49ae039 Remove unused file (#526)
This should have been removed as part of #521 but guess I missed it.
2021-11-16 20:27:21 +00:00
David Pedersen c4081ec40e Update tokio-tungstenite (#525) 2021-11-16 20:22:00 +00:00
David Pedersen 2bd0310463 New method router (#521)
* Empty crate

* basic setup

* Support `HEAD`

* Add remaining methods

* Impl Debug

* Add `MethodRouter::merge`

* WIP

* Support same route with different methods in different calls

* Update changelog

* Bring back `any` and `any_service`

* Address review feedback
2021-11-16 20:49:07 +01:00
david-perez 3cf8ee3b5e Drop Sync requirement on the handler function (#522)
Since it doesn't need to be called from different threads at the same
time.
2021-11-16 15:00:56 +01:00
Eray Karatay e2e9f1ff68 add axum-tutorial to ecosystem (#519) 2021-11-15 07:31:41 +00:00
David Pedersen 20fabd87e9 Add CORS example (#512) 2021-11-13 22:18:14 +01:00
David Pedersen e58336621d axum-debug: Version 0.2.0 (#511)
- **breaking:** Removed `debug_router` macro.
- **breaking:** Removed `check_service` function.
- **breaking:** Removed `debug_service` function.
axum-debug-v0.2.0
2021-11-13 20:44:13 +01:00
David Pedersen b9dfea6360 Version 0.3.3 (#510)
- Implement `FromRequest` for [`http::request::Parts`] so it can be used an
  extractor ([#489])
- Implement `IntoResponse` for `http::response::Parts` ([#490])

[#489]: https://github.com/tokio-rs/axum/pull/489
[#490]: https://github.com/tokio-rs/axum/pull/490
[`http::request::Parts`]: https://docs.rs/http/latest/http/request/struct.Parts.html
axum-v0.3.3 v0.3.3
2021-11-13 20:41:47 +01:00
David Pedersen 6372f93cc5 More clearly document accepting multiple methods (#503)
Seen a few users ask about this and could be documented more clearly.
2021-11-13 20:00:04 +01:00
Jonas Platte 89db85d202 axum-debug: Move axum dependency to dev-dependencies (#506) 2021-11-13 17:38:09 +01:00
David Pedersen c7b8813c47 Add trybuild tests for axum-debug (#501)
The things are also covered by the doc tests but this also gives us
assertions on the errors produced, which is the whole point of this
crate :)
2021-11-11 20:26:08 +00:00
David Pedersen 26faf0d7a6 Add axum-debug to list of community projects 2021-11-11 19:24:57 +01:00
David Pedersen 34942f3d70 Improve error message for nest("/", _) (#500) 2021-11-11 19:22:25 +01:00
David Pedersen fb8156f17c axum-debug readme fixes (#499)
* Fix build status badge in axum-debug

* fix links

* fix one more link
2021-11-11 16:53:07 +00:00
David Pedersen 5da3f34b3e Clean up axum-debug crate (#498)
* Clean up axum-debug crate

Mostly just brings the crate more in line with the rest of the crates in
the workspace.

I've also removed the axum-debug-macros crate since axum-debug only
contained one re-export from axum-debug-macros. So we didn't need two
crates. Can always bring the "backend" crate back if we need things in
axum-debug that aren't proc-macros.

* Just testing: This should make CI fail

* Misc CI clean up

* fix intentional breakage

* fix changelog

* Remove rustfmt config for now as it gives warnings on stable

* Fix paths
2021-11-11 17:33:33 +01:00
Eray Karatay f6b47478da Move axum-debug crate to workspace (#497)
* add axum-debug to workspace

* update readme

* add changes to changelog

* little docs update

* fix the gap

a tab has leaked into workspace Cargo.toml, it must be fixed

* address clippy warnings
2021-11-11 15:18:40 +01:00
Eray Karatay 2507463706 update tls-rustls example (#494) 2021-11-10 15:07:09 +01:00
Kelly Thomas Kline 0990e27964 Correct grammar (#492) 2021-11-10 12:13:47 +00:00
David Pedersen fdd889525d Implement FromRequest for http::request::Parts (#489)
Its a convenient way to extract everything from a request except the
body. Also makes sense for axum to provide this since other crates
can't.
2021-11-09 20:37:24 +00:00
David Pedersen 62be8aaa18 Implement IntoResponse for http::response::Parts (#490)
* Implement `IntoResponse` for `http::response::Parts`

Not sure there are many use cases for this but still thinks it makes to
provide since other crates can't.

* Use `Response::from_parts`
2021-11-09 20:50:29 +01:00
Imbolc 2ee66e812f FromStr based empty_string_as_none implementation (#486) 2021-11-09 13:05:31 +01:00
Jonas Platte 9c77ee0295 Use nightly clippy & rustfmt for more style checks (#487) 2021-11-09 11:53:57 +00:00
Jonas Platte bcd18a03bc Split first sentence into its own paragraph in TypedHeader docs (#485) 2021-11-09 12:14:42 +01:00
David Pedersen 3f84eca753 Add axum-handle-error-extract to ecosystem 2021-11-09 09:39:03 +01:00
Folyd 028f8a7242 Fix docs links (#481) 2021-11-09 07:26:53 +00:00
David Pedersen 7710f2cf7f Specify version of axum that axum-handle-error-extract depends on
Seems to be required by `cargo publish`
2021-11-08 19:28:28 +01:00
David Pedersen 7e40312cff Add axum-handle-error-extract crate (#468)
* Add `axum-handle-error-extract` crate

* fixup

* Fix readme link

* Add `HandleErrorExt` for new error handling middleware

* Revert "fixup"

This reverts commit 83e04954df.
2021-11-08 19:24:54 +01:00
David Pedersen 3d78711e47 Version 0.3.2 (#483)
- **added:** Add `Router::route_layer` for applying middleware that
  will only run on requests that match a route. This is useful for middleware
  that return early, such as authorization ([#474])

[#474]: https://github.com/tokio-rs/axum/pull/474
v0.3.2
2021-11-08 18:01:32 +00:00
David Pedersen 7eb2c40b24 Add Router::route_layer (#474)
This addresses something thats been bothering me for some time: Most middleware need to run regardless if the request matches a route or not. For example you don't wanna skip logging for unmatched requests.

However middleware such as authorization only make sense to run for matching requests. This previously wasn't possible to express and you'd have to manually apply the middleware to each handler. Consider this:

```rust
Router::new()
    .route("/foo", get(|| async {}))
    .layer(RequireAuthorizationLayer::bearer("password"));
```

Calling `GET /foo` with an invalid token would receive `401 Unauthorized` as expected however calling some unknown route like `GET /not-found` would also return `401 Unauthorized`. I think this is unexpected and have seen a few users ask questions about it.

It happened because the 404 you'd otherwise see is generated by a fallback service stored on `Router`. When adding a layer to the router the layer would also be applied to the fallback, which in the case of auth means the fallback would never be called for unauthorized requests.

I think what axum does today is the right default however I still think we should support this somehow. Especially since [`extractor_middleware`](https://docs.rs/axum/0.3.1/axum/extract/fn.extractor_middleware.html) is mainly useful for auth but it doesn't work great today due to this gotcha.

This PR proposes adding `Router::layer_on_matching_route` which only applies layers to routes, not the fallback, which fixes the issue. I'm not a big fan of the name `layer_on_matching_route`, would like something shorter, but I think it communicates the purpose decently.

The generics are a bit different since the request body used on the routes and the fallback must match, so layers that changes the request body type are not compatible with `layer_on_matching_route`. Such middleware are very rare so that should be fine.
2021-11-08 18:48:02 +01:00