Commit graph

241 commits

Author SHA1 Message Date
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
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
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 Pedersen
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 <jplatte@users.noreply.github.com>

* 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 <jplatte@users.noreply.github.com>
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
David Pedersen
554e3a0ad4
Remove routing::Layered (#383) 2021-10-13 12:21:22 +02: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
ac291baaec
Fix dead code warnings (#373) 2021-10-07 16:49:57 +02:00
David Pedersen
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 <jplatte@users.noreply.github.com>

Co-authored-by: Jonas Platte <jplatte@users.noreply.github.com>
2021-10-07 15:33:49 +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
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 Pedersen
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 <programatik29@gmail.com>
2021-10-02 13:43:59 +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
David Pedersen
f3c155bf5b
Fix typo in StreamBody docs (#343) 2021-09-22 14:20:43 +00:00
Imbolc
4be4e1d17c
Fix doc typo (#342) 2021-09-22 14:07:26 +00:00
David Pedersen
48401f2c8d
Simplify macros for implementing Handler and FromRequest (#340)
Makes the generated docs nicer and avoids having a recursive macro.
2021-09-19 15:51:25 +00:00
David Pedersen
0b9e0c7508
Refactor internal testing setup (#338)
This changes the test setup to use our own client rather than using
reqwest directly. Allows us to add several quality of life features like
always unwrapping results.
2021-09-19 09:38:34 +00:00
David Pedersen
2a683417d1
Clarify what handler::any and service::any accepts (#337)
They only accept standard HTTP methods and don't think we can fix that
without breaking changes.

Fixes https://github.com/tokio-rs/axum/issues/289
2021-09-19 08:28:15 +00:00
David Pedersen
593e3e319a
Improve extractor docs (#327)
* Improve extractor docs

- Moves things from the `extract` module docs to the root module docs to
  make them more discoverable
- Adds section showing commonly used extractors
- More clarity around multiple extractors that mutate the request

* english...
2021-09-18 19:09:53 +02:00
Olivier Pinon
0c18caa10f
Add accessors to TypedHeaderRejection fields (#317)
Fixes #316
2021-09-12 16:11:51 +00:00
heliumbrain
3741e16cf2
Fix typos in docs (#318)
* Fix typo in docs

Typos for FromRequest

* One more typo
2021-09-12 14:25:25 +00:00
Sidharth Kshatriya
39c5cc24fa
Remove repeated constraint (#294)
The constraint for B is repeated. Remove it.
2021-08-31 08:23:59 +00:00
David Pedersen
e698586193
Document adding middleware to multiple groups of routes (#293) 2021-08-31 07:07:57 +00:00
David Pedersen
c082107fb6
Document using StreamExt::split with WebSocket (#291)
Fixes https://github.com/tokio-rs/axum/issues/283
2021-08-30 21:13:50 +00:00
Ken-Miura
c7c73a0d72
Fix a typo in documentation (#280) 2021-08-27 20:20:59 +02:00
Jonas Platte
e41bac7f39
Expose hyper's http2 feature flag (#279)
* Order features alphabetically

… in Cargo.toml and crate docs.

* Improve ws feature docs

* Expose hyper's http2 feature flag
2021-08-27 08:58:50 +00:00
David Pedersen
4c5068c01f
Add Send + Sync check to all services (#277)
Should prevent us accidentally introducing breaking changes.

Fixes https://github.com/tokio-rs/axum/issues/275
2021-08-26 20:59:55 +02:00
David Pedersen
a0be328976
Revert "Remove buffer from BoxRoute (#270)" (#273)
This reverts commit 552d69e5d4.
2021-08-26 14:11:38 +00:00
David Pedersen
552d69e5d4
Remove buffer from BoxRoute (#270)
Boxing a service normally means using `tower::util::BoxService`. That
doesn't implement `Clone` however so normally I had been combining it
with `Buffer` to get that.

But recently I discovered https://github.com/dtolnay/dyn-clone which
makes it possible to clone trait objects. So this adds a new internal
utility called `CloneBoxService` which replaces the previous
`BoxService` + `Buffer` combo in `BoxRoute`.

I'll investigate upstreaming that to tower. I think it makes sense there
since box + clone is quite a common need.
2021-08-26 06:34:53 +00:00
David Pedersen
20f6c3b509
Remove needless traits bounds from Router::boxed (#269)
Turns out these bounds weren't actually needed.

I was hoping it would speed up compile times but that isn't the case.
2021-08-26 08:24:21 +02:00
David Pedersen
0d2db387a8
Fix URI captures matching empty segments (#264)
It was never the intention that `/:key` should match `/`. This fixes
that.

Part of https://github.com/tokio-rs/axum/issues/259
2021-08-24 18:27:06 +00:00
Jonas Platte
ab207af060
Rename .route() / .nest() "description" to "path" (#265) 2021-08-24 19:29:28 +02:00
David Pedersen
3d4ef9dc32
Document how to implement IntoResponse for custom error type (#258)
Fixes https://github.com/tokio-rs/axum/issues/249
2021-08-24 12:42:10 +02:00
Jonas Platte
536b8ca4ec
Add Redirect::to constructor (#255)
The motivation for this is established in the issue it fixes.

Resolves #248
2021-08-24 12:13:18 +02:00
bear
52ccb1bf42
Update StreamBody doc link (#253) 2021-08-24 07:58:35 +02:00
David Pedersen
0ab6ea6b6a Mention tower-log feature in docs 2021-08-23 18:40:18 +02:00
David Pedersen
6777dc1e5c
Add constructor to Sse (#244)
I think this is more consistent with the rest of the API
2021-08-23 17:51:30 +02:00
David Pedersen
a753eac23f
Remove boxing from StreamBody (#241)
I just had a thought: Why should `response::Headers` be generic, but
`body::StreamBody` should not? `StreamBody` previously boxed the stream
to erase the generics. So we had `response::Headers<T>` but
`body::StreamBody`, without generics.

After thinking about it I think it actually makes sense for responses to
remain generic because you're able to use `impl IntoResponse` so you
don't have to name the generics.

Whereas in the case of `BodyStream` (an extractor) you cannot use `impl Trait`
so it makes sense to box the inner body to make the type easier to name. Besides,
`BodyStream` is mostly useful when the request body isn't `hyper::Body`, as
that already implements `Stream`.
2021-08-22 22:03:56 +02:00
David Pedersen
dbab5a84b4
Expand middleware docs (#239)
Adds docs on
- Commonly used middleware
- Writing your own middleware
- Links to tower's guides
2021-08-22 15:56:56 +02:00
David Pedersen
2322d39800
Add StreamBody (#237)
This adds `StreamBody` which converts a `Stream` of `Bytes` into a `http_body::Body`.

---

As suggested by Kestrer on Discord it would make sense for axum to provide different kinds of body types other than `Empty`, `Full`, and `hyper::Body`. There is also some talk about [splitting up `hyper::Body`](https://github.com/hyperium/hyper/issues/2345) so this can be seen as getting started on that effort. axum's body types could be moved to hyper or http-body if thats the direction we decide on.

The types I'm thinking about adding are:

- `StreamBody`-  added in this PR
- `AsyncReadBody` - similar to [http-body#41](https://github.com/hyperium/http-body/pull/41/files)
- `ChannelBody` - similar to `hyper::Body::channel`
2021-08-22 14:41:51 +02:00
David Pedersen
80a8355eff
Remove generic parameter from BodyStream (#234)
I think `BodyStream` is more useful without being generic over the
request body.

I'm also looking into adding a response body from a stream called
`StreamBody` which will work pretty much opposite to this.
2021-08-22 11:33:38 +02:00
David Pedersen
add3dc36f9
Rename extract::Body to extract::RawBody (#233) 2021-08-21 20:04:39 +02:00
David Pedersen
fbd43c6600
Document not being able to mix fallible and infallible routes (#232)
I haven't been able to find a proper solution for #89 so for now I think
we should document the issue and move on with shipping 0.2.

Part of https://github.com/tokio-rs/axum/issues/89
2021-08-21 15:36:50 +02:00