Commit Graph
365 Commits
Author SHA1 Message Date
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
David Pedersen 554e3a0ad4 Remove routing::Layered (#383) 2021-10-13 12:21:22 +02:00
silvioprog 8ca5538405 Fix typo in main.rs (#381) 2021-10-12 18:20:27 +00:00
David Pedersen ce5834ab80 Expand accepted content types for JSON requests (#378)
* Expand accepted content types for JSON requests

Fixes https://github.com/tokio-rs/axum/issues/375

* changelog

* add test for content type without spaces

* Don't accept `text/json`

* small clean up
2021-10-08 14:51:22 +00:00
David Pedersen fe4c0ae386 Remove some #[allow(warnings)] (#376)
These were probably added during development and then forgotten to be
removed.
2021-10-08 14:09:44 +00:00
David Pedersen 2bedcc285b Update changelog with 0.2.8 2021-10-07 17:28:56 +02:00
David Pedersen a30f123f35 Update changelog with 0.2.7 2021-10-07 17:11:08 +02:00
David Pedersen ac291baaec Fix dead code warnings (#373) 2021-10-07 16:49:57 +02:00
David PedersenandJonas Platte 5dc5a7cb6e Document debugging handler type errors with "axum-debug" (#372)
* Document debugging handler type errors with "axum-debug"

* Apply suggestions from code review

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

Co-authored-by: Jonas Platte <[email protected]>
2021-10-07 15:33:49 +02:00
Jonas Platte d29c1f26c2 Bump minimum version of async-trait (#369)
Older versions generate invalid code for Handler impls.
2021-10-06 20:46:10 +02:00
Eray Karatay b7002f68d5 Update some examples (#364) 2021-10-05 07:50:27 +02:00
David Pedersen afabded385 Percent decode automatically in extract::Path (#272)
* Percent decode automatically in `extract::Path`

Fixes https://github.com/tokio-rs/axum/issues/261

* return an error if path param contains invalid utf-8

* Mention automatic decoding in the docs

* Update changelog: This is a breaking change

* cleanup

* fix tests
2021-10-02 14:04:29 +00:00
David Pedersen 2c2bcd7754 Update changelog 2021-10-02 15:48:52 +02:00
Jonas Platte 250ea0cfef Make JSON and HTTP1 support optional (#286)
* Make json support an optional feature

* Fix Json type documentation

* Make hyper's http1 feature optional
2021-10-02 15:46:33 +02:00
David PedersenandProgramatik cc4ae6b297 Improve performance of BoxRoute (#339)
* Improve performance of `BoxRoute`

This is based on #315 but slightly shorter.

It removes the need for a `tower::buffer::Buffer` in `BoxRoute` which
improves performance.

* changelog

Co-authored-by: Programatik <[email protected]>
2021-10-02 13:43:59 +00:00
David Pedersen 7fae35020a Version 0.2.6 (#360) v0.2.6 axum-v0.2.6 2021-10-02 11:33:52 +00:00
David Pedersen 038c17a514 Add Customizing extractor responses section to docs (#359)
Should make the example easier easier to find for some.
2021-10-02 11:19:32 +00:00