Commit Graph
381 Commits
Author SHA1 Message Date
David Pedersen 394d4b14f6 Mention handling extractor failures in error handling docs 2021-11-02 18:02:09 +01:00
David Pedersen 2957f48ace Mention MSRV bump in changelog 2021-11-02 17:58:21 +01:00
David Pedersen 6b69368895 Small changelog fixes 2021-11-02 17:55:42 +01:00
David Pedersen 9512d14c99 Add Handler::{into_make_service, into_make_service_with_connect_info} (#444)
* Make `IntoMakeService(WithConnectInfo)?` work with any Service

* Add `Handler::{into_make_service, into_make_service_with_connect_info}`

These are useful if you want to run a handler without a `Router`, for
example to make a proxy.
2021-11-02 17:11:18 +01:00
David Pedersen 98907b8887 Add example showing how to handle empty vs missing query params (#443) 2021-11-02 14:42:47 +01:00
David Pedersen a048d6443b Revert hello-world example
Was accidentally changed in another PR
2021-11-02 13:07:49 +01:00
Michael Grigoryan 5e44295a82 Fix typo in CHANGELOG (#442) 2021-11-02 07:50:10 +01:00
David Pedersen 1b98328dc8 Clean up some todos (#441) 2021-11-01 22:36:17 +00:00
David Pedersen 3d07d40e02 Remove Sync requirement from response bodies (#440)
As we learned [in Tonic] bodies don't need to be `Sync` because they can
only be polled from one thread at a time.

This changes axum's bodies to no longer require `Sync` and makes
`BoxBody` an alias for `UnsyncBoxBody<Bytes, axum::Error>`.

[in Tonic]: https://github.com/hyperium/tonic/issues/117
2021-11-01 22:37:16 +01:00
David Pedersen 9465128f3e Rework docs (#437)
This reworks axum's docs in an attempt to make things easier to find. Previously I wasn't a fan of those docs for the same topic were spread across the root module docs and more specific places like types and methods.

This changes it such that the root module docs only gives a high level introduction to a topic, perhaps with a small example, and then link to other places where all the details are. This means `Router` is now the single place to learn about routing, and etc for the topics like handlers and error handling.
2021-11-01 21:13:37 +00:00
David Pedersen 1c6038c09f Depend on tower 0.4.10 (#439)
axum uses `impl Layer for ServiceBuilder` internally which requires
tower 0.4.10. Making that explicit should help users updating to axum
0.3 without also having to manually bump their tower dependency.
2021-11-01 13:15:34 +00:00
David Pedersen 2b8494a576 Make MethodNotAllowed public (#436)
Not sure why this wasn't caught by `#![deny(unreachable_pub, private_in_public)]`
2021-10-31 20:57:32 +01:00
David Pedersen 857ecd7314 Break root module docs into separate files (#432)
For 0.3 I'm thinking about some changes I wanna make to the docs. I
don't like how information is currently spread over so many places.
Still thinking about how I wanna re-organize it.

However I do think it makes sense to break the root module docs into
separate files that get included with `#![doc = include_str!("file")]`.
Makes working on a single section easier and more focused. It looks the
same for the user reading the docs.

This means axum's MSRV is now 1.54 but since thats two releases ago I'm
fine with that.
2021-10-31 20:37:56 +01:00
Paul Butler 9145c0e396 Add notify.run to community showcase (#435) 2021-10-31 08:22:46 +01:00
david-perez be62f49b7e Fix typo in sealed trait used in Handler (#430) 2021-10-28 16:44:04 +00:00
david-perez 21e5b654ab Fix NotFound docs (#431) 2021-10-28 16:41:52 +00:00
David Pedersen 2d1635a6d7 Fix sse and ws examples (#429)
* Fix sse example

* Fix websockets example
2021-10-27 15:52:41 +00:00
David Pedersen a3822cb175 Add test for wildcards with trailing slashes
Its already working, just to make sure we don't regress in the future
2021-10-27 09:32:14 +02:00
David Pedersen a2627e9084 Remove support for CONNECT (#428)
Given how different `CONNECT` requests are I think its fine to require
users to handle them manually. Since they don't contain paths you
probably don't need a full routing framework 🤷

An example can be found [here](https://github.com/tokio-rs/axum/blob/main/examples/http-proxy/src/main.rs)

Fixes #418
2021-10-26 21:11:33 +00:00
David Pedersen 94330b7796 Panic if routing to router (#427)
This panics if you pass a `Router` to `Router::route`. Thats invalid and
will result in unreachable routes.

Unfortunately I don't think we can make it a type error while supporting
general `Service`s. So I think this is a decent workaround.

Fixes https://github.com/tokio-rs/axum/issues/174
2021-10-26 20:44:16 +00:00
David Pedersen 92f96a201c Implement nesting as regular wildcard routes (#426)
When fixing bugs with `MatchedPath` (introduced to fix https://github.com/tokio-rs/axum/issues/386) I realized nesting could basically be implemented using regular routes, if we can detect that the service passed to `nest` is in fact a `Router`. Then we can transfer over all its routes and add the prefix.

This makes nesting much simpler in general and should also be slightly faster since we're no longer nesting routers.
2021-10-26 20:31:22 +00:00
David Pedersen fc9bfb8a50 Add HTTP proxy example (#425) 2021-10-26 20:46:40 +02:00
David Pedersen 302a720271 Breakup routing module (#424)
The routing module had gotten quite hard to navigate so this breaks it
into smaller modules. No user facing changes.
2021-10-26 17:51:22 +00:00
David Pedersen 91981db8c7 Fix middleware not seeing the full URI for nested routes (#423)
We stripped the prefix before calling any middleware. Instead the prefix
should be stripped just before calling the actual route. This way
middleware still see the full URI, as it used to work in 0.2.

Fixes #419
2021-10-26 19:29:59 +02:00
David Pedersen 8fe4eaf1d5 Run middleware for requests with no matching route (#422)
While thinking about #419 I realized that `main` had a bug where
middleware wouldn't be called if no route matched the incoming request.
`Router` would just directly return a 404 without calling any
middleware.

This fixes by making the fallback default to a service that always
returns 404 and always calling that if no route matches.

Layers applied to the router is then also applied to the fallback.

Unfortunately this breaks #380 but I don't currently see a way to
support both. Auth middleware need to run _after_ routing because you
don't care about auth for unknown paths, but logging middleware need to
run _before_ routing because they do care about seeing requests for
unknown paths so they can log them...

Part of #419
2021-10-26 18:39:05 +02:00
David Pedersen e9533c566f Don't allow empty paths (#421) 2021-10-26 15:37:25 +00:00
David Pedersen 9b17d86b92 Update to matchit 0.4.4 (#417)
- Static vs dynamic paths are now supported meaning `/foo` and `/:key`
  are not considered to overlap.
- A bug we hit regarding trailing slashes is fixed.
2021-10-25 23:35:33 +00:00
David Pedersen efdd197643 More consistent poll_ready usage
The `#[inline]`s probably aren't necessary but are consistent with other
parts of the code and tower in general.
2021-10-26 01:24:57 +02:00
David Pedersen e949c47df6 Fix inconsistent naming of WebSocket rejections (#416) 2021-10-25 23:09:47 +00:00
David Pedersen 040f63b8e2 Clean up constructors for future newtypes (#415) 2021-10-25 23:03:16 +00:00
David Pedersen 68e44fa9da Vendor AddExtensionLayer and AddExtension (#414)
This remove tower-http from axum's public API. I would like to be able
to make breaking releases of tower-http without also having to ship a
breaking release of axum.
2021-10-25 22:08:59 +00:00
David Pedersen 0a3f69af0d Reorganize changelog (#413)
* Reorganize changelog

When it starts growing this big I think grouping it into topics is nice.

* misc fixes
2021-10-25 23:52:22 +02:00
David Pedersen 02a035fb14 Add MatchedPath extractor (#412)
Fixes #386
2021-10-25 21:38:29 +00:00
David Pedersen e43bdf0ecf Rename EmptyRouter to MethodNotAllowed (#411)
It is no longer needed in `Router` so can be changed to always return
`403 Method Not Allowed`.
2021-10-25 23:28:22 +02:00
David Pedersen 59819e42bf Correctly handle trailing slashes in routes (#410) 2021-10-25 20:42:49 +00:00
David Pedersen baf7cabfe1 Add test for middleware that return early (#409)
* Add test for middleware that return early

Turns out #408 fixed #380.

* changelog
2021-10-25 19:46:49 +00:00
David Pedersen 85f5511313 Small routing cleanup
Storing the paths like this should be slightly more efficient.
2021-10-25 21:30:35 +02:00
David Pedersen 3626facbda Update changelog 2021-10-25 20:51:07 +02:00
David Pedersen 1634e67e99 Stores routes in a map (#408)
With https://github.com/tokio-rs/axum/pull/404 and https://github.com/tokio-rs/axum/pull/402 all routes now have the same types and thus we don't need to nest them but can instead store them all in a map. This simplifies the routing quite a bit and is faster as well.

High level changes:
- Routes are now stored in a `HashMap<RouteId, Route<B>>`.
- `Router::or` is renamed to `Router::merge` because thats what it does now. It copies all routes from one router to another. This also means overlapping routes will cause a panic which is nice win.
- `Router::merge` now only accepts `Router`s so added `Router::fallback` for adding a global 404 handler.
- The `Or` service has been removed.
- `Router::layer` now only adds layers to the routes you actually have meaning middleware runs _after_ routing. I believe that addresses https://github.com/tokio-rs/axum/issues/380 but will test that on another branch.
2021-10-25 20:49:39 +02:00
QP Hou fb87a6a4d3 Add ROAPI to community showcase (#407) 2021-10-25 08:15:16 +02:00
David Pedersen 47017f90b3 Support deserializing i128 and u128 in extract::Path (#406)
Fixes https://github.com/tokio-rs/axum/issues/398
2021-10-24 20:27:51 +00:00
David Pedersen 7692baf837 Reorganize method routers for handlers and services (#405)
* Re-organize method routing for handlers

* Re-organize method routing for services

* changelog
2021-10-24 20:05:16 +00:00
David Pedersen 0ee7379d4f Fix compile time regression by boxing routes internally (#404)
This is a reimplementation of #401 but with the new matchit based router.

Fixes #399
2021-10-24 20:52:42 +02:00
David Pedersen 1a764bb8d7 Remove MaybeSharedNode from Router (#403)
In #363 I added `MaybeSharedNode` which makes `Router` faster to clone
_if_ you're using `into_make_service`. However I would like instead like
to find a solution that works even when you're not using
`into_make_service`.

Using an `Arc<RwLock<Node<_>>>` is probably the only solution but would
like to experiment. For now I'm gonna rollback `MaybeSharedNode`.
Changing it wont require user facing changes.
2021-10-24 17:49:31 +00:00
David Pedersen f10508db0b Revamp error handling model (#402)
* Revamp error handling model

* changelog improvements and typo fixes

* Fix a few more Infallible bounds

* minor docs fixes
2021-10-24 17:33:03 +00:00
David PedersenandJonas Platte 1a78a3f224 "matchit" based router (#363)
* "matchit" based router

* Update changelog

* Remove dependency on `regex`

* Docs

* Fix typos

* Also mention route order in root module docs

* Update CHANGELOG.md

Co-authored-by: Jonas Platte <[email protected]>

* Document that `/:key` and `/foo` overlaps

* Provide good error message for wildcards in routes

* minor clean ups

* Make `Router` cheaper to clone

* Ensure middleware still only applies to routes above

* Remove call to issues from changelog

We're aware of the short coming :)

* Fix tests on 1.51

Co-authored-by: Jonas Platte <[email protected]>
2021-10-24 15:22:49 +02:00
David Pedersen 9fcc884374 Change Connected::connect_info to return Self (#396)
I've been thinking that having an associated type probably isn't
necessary. I imagine most users are either using `SocketAddr` to the
remote connection IP, or writing their own connection struct.
2021-10-19 23:06:15 +02:00
Eray Karatay a724af3d0a Add reverse-proxy example (#389) 2021-10-19 22:52:19 +02:00
David Pedersen e71ab44bd5 Update main to version 0.3.0 2021-10-19 22:37:57 +02:00
David Pedersen 24eb661fe4 Fix CI caching (#395) 2021-10-19 22:25:06 +02:00