Commit Graph
100 Commits
Author SHA1 Message Date
David Pedersen 36c8d97059 Reorder changelog a bit 2021-08-07 22:35:41 +02:00
David Pedersen 6ce355cca3 Add unique future types for all services (#157)
So we can more easily change them in the future.
2021-08-07 22:27:27 +02:00
David Pedersen 2389761ce7 Add dedicated tracing/logging example (#155)
Useful to link to since several have asked.
2021-08-07 22:11:55 +02:00
David Pedersen 85bb0158be Fix outdated docs 2021-08-07 22:11:27 +02:00
David Pedersen c570fb2d52 Fix Uri extractor not being the full URI if using nest (#156) 2021-08-07 22:07:50 +02:00
David Pedersen a6b3e09827 Remove UrlParamsMap and UrlParams (#154)
Use `extract::Path` instead.
2021-08-07 21:22:08 +02:00
David Pedersen 6a82dd75ea Implement std::error::Error for all rejections (#153) 2021-08-07 21:03:04 +02:00
David Pedersen a38d5c3592 Re-export http_body::Body (#152)
Makes writing `IntoResponse` impls easier
2021-08-07 20:29:24 +02:00
David Pedersen 4bb17cbc2d Remove take_* methods from RequestParts for Version, Method, and Uri (#151)
* Remove `RequestParts::take_method`

* Remove `RequestParts::take_uri`

* Remove `RequestParts::take_version`
2021-08-07 20:24:13 +02:00
David Pedersen 75b5615ccd Add axum::Error (#150)
Replace `BoxStdError` and supports downcasting
2021-08-07 19:56:44 +02:00
David Pedersen ab927033b3 Support returning any http_body::Body from IntoResponse (#86)
Adds associated `Body` and `BodyError` types to `IntoResponse`. This is required for returning responses with bodies other than `hyper::Body` from handlers. That wasn't previously possible.

This is a breaking change so should be shipped in 0.2.
2021-08-07 18:03:21 +02:00
David Pedersen 4194cf70da Change WebSocket API to use an extractor (#121)
Fixes https://github.com/tokio-rs/axum/issues/111

Example usage:

```rust
use axum::{
    prelude::*,
    extract::ws::{WebSocketUpgrade, WebSocket},
    response::IntoResponse,
};

let app = route("/ws", get(handler));

async fn handler(ws: WebSocketUpgrade) -> impl IntoResponse {
    ws.on_upgrade(handle_socket)
}

async fn handle_socket(mut socket: WebSocket) {
    while let Some(msg) = socket.recv().await {
        let msg = if let Ok(msg) = msg {
            msg
        } else {
            // client disconnected
            return;
        };

        if socket.send(msg).await.is_err() {
            // client disconnected
            return;
        }
    }
}
```
2021-08-07 17:26:23 +02:00
David Pedersen 404a3b5e8a Add default for RequestParts type param (#148)
Same reason as https://github.com/tokio-rs/axum/pull/146
2021-08-07 17:10:00 +02:00
David Pedersen 045ec57d92 Add RouteDsl::or to combine routes (#108)
With this you'll be able to do:

```rust
let one = route("/foo", get(|| async { "foo" }))
    .route("/bar", get(|| async { "bar" }));

let two = route("/baz", get(|| async { "baz" }));

let app = one.or(two);
```

Fixes https://github.com/tokio-rs/axum/issues/101
2021-08-07 17:09:45 +02:00
David Pedersen b1e7a6ae7b Enable CI caching (#149) 2021-08-07 17:09:30 +02:00
David Pedersen 95d7582d28 Fix ServiceExt::handle_error footgun (#120)
As described in
https://github.com/tokio-rs/axum/pull/108#issuecomment-892811637, a
`HandleError` created from `axum::ServiceExt::handle_error` should _not_
implement `RoutingDsl` as that leads to confusing routing behavior.

The technique used here of adding another type parameter to
`HandleError` isn't very clean, I think. But the alternative is
duplicating `HandleError` and having two versions, which I think is less
desirable.
2021-08-07 16:44:12 +02:00
David Pedersen b5b9db47db Remove QueryStringMissing as it was no longer being used (#125)
* Remove `QueryStringMissing` as it was no longer being used

* remove it in a few more places
2021-08-07 16:31:51 +02:00
David Pedersen 123b1b3c5e Remove future re-exports (#133)
These types were moved around in
https://github.com/tokio-rs/axum/pull/130 but re-export from their old
location for backwards compatibility.

This removes the re-exports.
2021-08-07 16:22:53 +02:00
David Pedersen a0a19c8362 Remove Copy some impls (#132)
https://github.com/tokio-rs/axum/pull/129 was a breaking change, in part
because I had to remove the `Copy` impl from `OnMethod`.

For the sake of future proofing I think we should remove other `Copy`
impls from services as well. We can always bring them back once things
have matured more.

These types no longer implement `Copy`:

- `EmptyRouter`
- `ExtractorMiddleware`
- `ExtractorMiddlewareLayer`
2021-08-07 16:13:56 +02:00
David Pedersen d7d97a613e Adjust Json docs 2021-08-07 16:10:07 +02:00
David Pedersen 3d45a97db9 Make FromRequest default to use axum::body::Body (#146)
Most users will implement `FromRequest<axum::body::Body>` so making that
the default makes things a bit easier to use.
2021-08-07 12:22:14 +02:00
David Pedersen 5922c4fa50 Run CI for main
...and not `master`
2021-08-07 11:11:29 +02:00
David Pedersen 904227419c Fix tests for 1.51
They used array `IntoIterator`.
2021-08-07 11:08:20 +02:00
David Pedersen e13f1da11d Version 0.1.3 (#139)
- Fix stripping prefix when nesting services at `/` ([#91](https://github.com/tokio-rs/axum/pull/91))
- Add support for WebSocket protocol negotiation ([#83](https://github.com/tokio-rs/axum/pull/83))
- Use `pin-project-lite` instead of `pin-project` ([#95](https://github.com/tokio-rs/axum/pull/95))
- Re-export `http` crate and `hyper::Server` ([#110](https://github.com/tokio-rs/axum/pull/110))
- Fix `Query` and `Form` extractors giving bad request error when query string is empty. ([#117](https://github.com/tokio-rs/axum/pull/117))
- Add `Path` extractor. ([#124](https://github.com/tokio-rs/axum/pull/124))
- Fixed the implementation of `IntoResponse` of `(HeaderMap, T)` and `(StatusCode, HeaderMap, T)` would ignore headers from `T` ([#137](https://github.com/tokio-rs/axum/pull/137))
- Deprecate `extract::UrlParams` and `extract::UrlParamsMap`. Use `extract::Path` instead ([#138](https://github.com/tokio-rs/axum/pull/138))
2021-08-06 11:20:42 +02:00
David Pedersen 811b1d896c Deprecate extract::UrlParams and extract::UrlParamsMap (#138)
Use `extract::Path` instead. It supports everything the two other do,
and more.
2021-08-06 10:38:38 +02:00
David Pedersen 2be79168d8 Handle METHOD_NOT_ALLOWED in 404 example (#131)
If a route existed but had no handler for the method, the code used in
the 404 example wouldn't catch it.
2021-08-06 01:15:23 +02:00
David Pedersen d4ce90e2e6 Move response futures into their own modules (#130)
It cleans up the docs to have the futures in their own modules as users
are unlikely to look at them. Also matches the pattern used in tower
https://docs.rs/tower/0.4.8/tower/util/future/index.html.

Added re-exports to the old locations so its not a breaking change.
2021-08-06 01:15:10 +02:00
David Pedersen 1509d4ad12 Add note about safety to readme 2021-08-05 11:51:33 +02:00
David Pedersen a8eb26b672 Fix typos in rejection messages 2021-08-05 08:36:42 +02:00
David Pedersen a95b48b70c Deprecate QueryStringMissing (#119)
Since https://github.com/tokio-rs/axum/pull/117 its no longer used. Will
be removed in 0.2.
2021-08-04 17:58:34 +02:00
David Pedersen 5c12328892 Replace hyper::Server with axum::Server in docs (#118)
* Replace `hyper::Server` with `axum::Server` in docs

* Change readme as well
2021-08-04 15:38:51 +02:00
David Pedersen cffdedc055 Move comments in docs outside code block 2021-08-04 15:07:04 +02:00
David Pedersen 96fac52519 Make docs on required deps more clear 2021-08-04 15:06:47 +02:00
David Pedersen 9a6bc4e962 Break up extract.rs (#103)
This breaks up `extract.rs` into several smaller submodules. The public
API remains the same.

This is done in prep for adding more tests to extractors which would get
messy if they were all in the same file.
2021-08-03 21:55:48 +02:00
David Pedersen f84f52d61e Contributing guide fixes 2021-08-03 21:44:49 +02:00
David Pedersen 9fbababc3a Make it clear how to run all examples (#92)
* Handle errors in websocket example

* Make it clear how to run all examples
2021-08-02 23:09:09 +02:00
David Pedersen 6a078ddb71 Fix stripping prefix when nesting at / (#91)
* Fix stripping prefix when nesting at `/`

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

* changelog
2021-08-02 22:40:33 +02:00
David Pedersen a0f6dccc5e Remove dbg! left in by accident 2021-08-02 09:46:08 +02:00
David Pedersen 55c1a29420 Version 0.1.2 (#80) 2021-08-01 22:13:43 +02:00
David Pedersen 666d088b26 Including tracing setup in all examples (#79) 2021-08-01 22:01:33 +02:00
David Pedersen 6d787665d6 Server-Sent Events (#75)
Example usage:

```rust
use axum::{prelude::*, sse::{sse, Event, KeepAlive}};
use tokio_stream::StreamExt as _;
use futures::stream::{self, Stream};
use std::{
    time::Duration,
    convert::Infallible,
};

let app = route("/sse", sse(make_stream).keep_alive(KeepAlive::default()));

async fn make_stream(
    // you can also put extractors here
) -> Result<impl Stream<Item = Result<Event, Infallible>>, Infallible> {
    // A `Stream` that repeats an event every second
    let stream = stream::repeat_with(|| Event::default().data("hi!"))
        .map(Ok)
        .throttle(Duration::from_secs(1));

    Ok(stream)
}
```

Implementation is based on [warp's](https://github.com/seanmonstar/warp/blob/master/src/filters/sse.rs)
2021-08-01 21:49:17 +02:00
David Pedersen c232c56de0 Mention required dependencies in docs (#77)
Fixes https://github.com/tokio-rs/axum/issues/70
2021-08-01 21:33:55 +02:00
David Pedersen 69ae7a686a Fix websockets failing on Firefox (#76)
Axum expected the `Connection` header to be _exactly_ `upgrade`. Turns
out thats a bit too strict as this didn't work in Firefox.

Turns out `Connection` just has to contain `upgrade`. At least that is
what [warp does](https://github.com/seanmonstar/warp/blob/master/src/filters/ws.rs#L46).
2021-08-01 21:00:38 +02:00
David Pedersen 2cf28c6794 Improve error message of MissingExtension rejections (#72)
Now includes the name of missing type.
2021-08-01 15:50:57 +02:00
David Pedersen 6f30d4aa6a Improve documentation for router (#71)
Fixes #67
2021-08-01 15:42:50 +02:00
David Pedersen f581e3efb2 Clarify required response body type when routing to tower::Services (#69) 2021-08-01 15:42:12 +02:00
David Pedersen 593f3e115f Clean up TLS example 2021-08-01 13:48:39 +02:00
David Pedersen ea82acd175 Add sessions and cookies examples (#65)
Uses [`async-session`](https://crates.io/crates/async-session).
2021-08-01 09:15:44 +02:00
David Pedersen 30058dbbed Use main for build status in readme 2021-08-01 08:48:31 +02:00
David Pedersen f67abd1ee2 Add extractor for remote connection info (#55)
Fixes https://github.com/tokio-rs/axum/issues/43

With this you can get the remote address like so:

```rust
use axum::{prelude::*, extract::ConnectInfo};
use std::net::SocketAddr;

let app = route("/", get(handler));

async fn handler(ConnectInfo(addr): ConnectInfo<SocketAddr>) -> String {
    format!("Hello {}", addr)
}

// Starting the app with `into_make_service_with_connect_info` is required
// for `ConnectInfo` to work.
let make_svc = app.into_make_service_with_connect_info::<SocketAddr, _>();

hyper::Server::bind(&"0.0.0.0:3000".parse().unwrap())
    .serve(make_svc)
    .await
    .expect("server failed");
```

This API is fully generic and supports whatever transport layer you're using with Hyper. I've updated the unix domain socket example to extract `peer_creds` and `peer_addr`.
2021-07-31 21:36:30 +02:00
David Pedersen 407aa533d7 Return 405 Method Not Allowed for unsupported method for route (#63)
Fixes https://github.com/tokio-rs/axum/issues/61
2021-07-31 21:05:53 +02:00
David Pedersen 5407247e90 Implement Deref for extractors (#56)
Fixes https://github.com/tokio-rs/axum/issues/54
2021-07-31 14:54:10 +02:00
David Pedersen 100ecea581 Mention benchmark in readme 2021-07-31 14:53:12 +02:00
David Pedersen 132da26d5b Add unix domain socket example (#53)
Not actually related to Axum, can be implemented directly with Hyper, but I figure its nice to have for demonstration and might help catch accidental breaking changes in the future.
2021-07-31 12:22:38 +02:00
David Pedersen d88212c015 Implement Sink and Stream for WebSocket (#52)
Among other things, this makes [`StreamExt::split`](https://docs.rs/futures/0.3.16/futures/stream/trait.StreamExt.html#method.split) accessible so one can read and write at the same time.
2021-07-31 10:51:41 +02:00
David Pedersen 6c1279a415 Version 0.1.1 2021-07-30 17:20:38 +02:00
David Pedersen 446cfca753 Bring back badges 2021-07-30 17:18:54 +02:00
David Pedersen ca34b4184a Update changelog for 0.1.0 release 2021-07-30 17:17:25 +02:00
David Pedersen 5d2580a9d8 Misc readme fixes 2021-07-30 17:17:18 +02:00
David Pedersen 272e22a23b Release prep 2021-07-30 15:56:01 +02:00
David Pedersen 94d2b5f8a6 Misc readme/docs improvements 2021-07-30 15:51:59 +02:00
David Pedersen d843f4378b Make websocket handlers support extractors (#41) 2021-07-30 15:19:53 +02:00
David Pedersen d927c819d3 Clarify docs around body extractors 2021-07-23 00:27:08 +02:00
David Pedersen f25f7f90ff Implement IntoResponse for Body 2021-07-22 21:22:46 +02:00
David Pedersen 1fb80a1129 Implement IntoResponse for HeaderMap 2021-07-22 21:21:53 +02:00
David Pedersen 6d483a623a Add testing example with real HTTP server 2021-07-22 21:12:40 +02:00
David Pedersen 9a419de290 Misc clean up 2021-07-22 21:12:29 +02:00
David Pedersen ba9c03d146 Update links 2021-07-22 19:39:08 +02:00
David Pedersen 9db3b92df4 Remove disclaimer from readme 2021-07-22 15:50:46 +02:00
David Pedersen 7c37bb818a Update goals in readme 2021-07-22 15:44:59 +02:00
David Pedersen 21db427077 Update examples readme 2021-07-22 15:42:04 +02:00
David Pedersen e4a0199c76 Add missing TOC link 2021-07-22 15:38:55 +02:00
David Pedersen 6705e79ed7 Add todos example (#38) 2021-07-22 15:38:32 +02:00
David Pedersen 8faed8120f Docs improvements (#37) 2021-07-22 15:00:33 +02:00
David Pedersen a658c94f23 Use correct error type if Json serialization fails
Fixes https://github.com/davidpdrsn/axum/issues/35
2021-07-22 13:26:14 +02:00
David Pedersen f32d325e55 Make extractors easier to write (#36)
Previously extractors worked directly on `Request<B>` which meant you
had to do weird tricks like `mem::take(req.headers_mut())` to get owned
parts of the request.

This changes that instead to use a new `RequestParts` type that have
methods to "take" each part of the request. Without having to do weird
tricks.

Also removed the need to have `B: Default` for body extractors.
2021-07-22 13:23:50 +02:00
David Pedersen e544fe1c39 More flexible generic responses 2021-07-22 11:14:55 +02:00
David Pedersen 028c472c84 Add Multipart extractor for consuming multipart/form-data requests (#32)
Multipart implementation on top of `multer`
2021-07-14 16:53:37 +02:00
David Pedersen e641caefaf Remove hyper-h1 and hyper-h2 features (#31) 2021-07-14 16:29:06 +02:00
David Pedersen 341ad61240 Clarify body extractors 2021-07-10 23:46:14 +02:00
David Pedersen 62da1eac00 Allow extractor_middleware to extract the body 2021-07-10 23:39:40 +02:00
David Pedersen 2e2f697f80 Minor docs improvements 2021-07-09 23:39:39 +02:00
David Pedersen 1cbd43cfc4 Add extractor_middleware (#29)
Converts an extractor into a middleware so it can be run for many routes
without having to repeat it in the function signature.
2021-07-09 23:38:59 +02:00
David Pedersen 0c19fa4d52 Minor readme improvements 2021-07-09 21:42:41 +02:00
David Pedersen f5fa64dae6 Name is no longer pending 2021-07-09 21:37:44 +02:00
David Pedersen 5a5710d290 Rename to axum (#28) 2021-07-09 21:36:14 +02:00
David Pedersen 3cd4a1d6a6 Fix for service as bottom handler (#27)
Would previously fail because of a mismatch in error types.
2021-07-06 09:40:25 +02:00
David Pedersen c4d266e94d Allow errors (#26)
This changes error model to actually allow errors. I think if we're going to use this for things like tonic's route we need a more flexible error handling model. The same `handle_error` adaptors are still there but services aren't required to have `Infallible` as their error type. The error type is simply propagated all the way through.
2021-07-05 16:18:39 +02:00
David Pedersen 3fc7f1880f Rename tokio-postgres example 2021-06-19 15:40:46 +02:00
David Pedersen 8d8cc3ba3d Examples readme (#25)
* Examples readme

* link?
2021-06-19 14:06:49 +02:00
David Pedersen 44577a0108 Add testing example (#24) 2021-06-19 13:44:21 +02:00
David Pedersen 356f1c8424 Generic request body (#22)
Fixes #21
2021-06-19 12:50:33 +02:00
David Pedersen 6a16cd40ca Add error handling and dependency injection example (#23) 2021-06-19 12:34:42 +02:00
David Pedersen 4fc3d8b5ba Replace unsafe with unwrap (#20) 2021-06-15 23:18:49 +02:00
David Pedersen 8a82fd00aa Add bb8 connection pool example (#19)
I figure this will be quite common.
2021-06-15 22:25:41 +02:00
David Pedersen b6e67eefd7 Add support for extracting typed headers (#18)
Uses the `headers` crate.
2021-06-15 21:27:21 +02:00
David Pedersen 2f6699aeae Add HTML template example (#17) 2021-06-13 13:58:12 +02:00
David Pedersen 460828a3cb Add versioning extractor example (#16) 2021-06-13 13:50:56 +02:00
David Pedersen 7684736817 Fix readme link 2021-06-13 13:11:57 +02:00
David Pedersen 97d9cb2ab7 Tweak readme example 2021-06-13 13:09:24 +02:00