From 74f80d5c11d0a212a545f053bfd4ca160bcedcd8 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Wed, 19 Feb 2025 21:22:03 -0500 Subject: Upgrade Axum to 0.8.1. --- Cargo.lock | 49 ++++++++++--------------------------------- Cargo.toml | 4 ++-- src/channel/routes/mod.rs | 4 ++-- src/clock.rs | 1 - src/event/extract.rs | 41 ++++++++++++++++++++++++++++++------ src/invite/routes/mod.rs | 4 ++-- src/message/routes/mod.rs | 2 +- src/token/extract/cookie.rs | 1 - src/token/extract/identity.rs | 18 ++++++++++++++-- src/ui/routes/mod.rs | 6 +++--- 10 files changed, 72 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a056285..dcf39b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,13 +140,13 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" dependencies = [ - "async-trait", "axum-core", "bytes", + "form_urlencoded", "futures-util", "http", "http-body", @@ -174,11 +174,10 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" dependencies = [ - "async-trait", "bytes", "futures-util", "http", @@ -195,25 +194,25 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.9.6" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c794b30c904f0a1c2fb7740f7df7f7972dfaa14ef6f57cb6178dc63e5dca2f04" +checksum = "460fc6f625a1f7705c6cf62d0d070794e94668988b1c38111baeec177c715f7b" dependencies = [ "axum", "axum-core", "bytes", "cookie", - "fastrand", + "form_urlencoded", "futures-util", "headers", "http", "http-body", "http-body-util", "mime", - "multer", "pin-project-lite", "serde", "serde_html_form", + "serde_path_to_error", "tower", "tower-layer", "tower-service", @@ -518,15 +517,6 @@ dependencies = [ "serde", ] -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -1218,9 +1208,9 @@ checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "md-5" @@ -1264,23 +1254,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "multer" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http", - "httparse", - "memchr", - "mime", - "spin", - "version_check", -] - [[package]] name = "num-bigint-dig" version = "0.8.4" diff --git a/Cargo.toml b/Cargo.toml index 86549b9..4f3615b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,8 @@ assets = [ [dependencies] argon2 = "0.5.3" async-trait = "0.1.86" -axum = { version = "0.7.9", features = ["form"] } -axum-extra = { version = "0.9.6", features = ["cookie", "query", "typed-header"] } +axum = { version = "0.8.1", features = ["form"] } +axum-extra = { version = "0.10.0", features = ["cookie", "query", "typed-header"] } chrono = { version = "0.4.39", features = ["serde"] } clap = { version = "4.5.30", features = ["derive", "env"] } futures = "0.3.31" diff --git a/src/channel/routes/mod.rs b/src/channel/routes/mod.rs index 696bd72..c1ef5cd 100644 --- a/src/channel/routes/mod.rs +++ b/src/channel/routes/mod.rs @@ -14,6 +14,6 @@ mod test; pub fn router() -> Router { Router::new() .route("/api/channels", post(post::handler)) - .route("/api/channels/:channel", post(channel::post::handler)) - .route("/api/channels/:channel", delete(channel::delete::handler)) + .route("/api/channels/{channel}", post(channel::post::handler)) + .route("/api/channels/{channel}", delete(channel::delete::handler)) } diff --git a/src/clock.rs b/src/clock.rs index 242bcdf..acd0df0 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -21,7 +21,6 @@ impl RequestedAt { } } -#[async_trait::async_trait] impl FromRequestParts for RequestedAt where S: Send + Sync, diff --git a/src/event/extract.rs b/src/event/extract.rs index e3021e2..4a35937 100644 --- a/src/event/extract.rs +++ b/src/event/extract.rs @@ -1,7 +1,7 @@ use std::ops::Deref; use axum::{ - extract::FromRequestParts, + extract::{FromRequestParts, OptionalFromRequestParts}, http::{request::Parts, HeaderName, HeaderValue}, }; use axum_extra::typed_header::TypedHeader; @@ -44,7 +44,6 @@ where } } -#[async_trait::async_trait] impl FromRequestParts for LastEventId where S: Send + Sync, @@ -53,12 +52,35 @@ where type Rejection = as FromRequestParts>::Rejection; async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { - // This is purely for ergonomics: it allows `RequestedAt` to be extracted - // without having to wrap it in `Extension<>`. Callers _can_ still do that, + // This is purely for ergonomics: it allows `LastEventId` to be extracted + // without having to wrap it in `TypedHeader<>`. Callers _can_ still do that, // but they aren't forced to. - let TypedHeader(requested_at) = TypedHeader::from_request_parts(parts, state).await?; + let header = + as FromRequestParts>::from_request_parts(parts, state).await?; - Ok(requested_at) + Ok(header.into()) + } +} + +impl OptionalFromRequestParts for LastEventId +where + S: Send + Sync, + T: Serialize + DeserializeOwned, +{ + type Rejection = as FromRequestParts>::Rejection; + + async fn from_request_parts( + parts: &mut Parts, + state: &S, + ) -> Result, Self::Rejection> { + // This is purely for ergonomics: it allows `Option` to be extracted + // without having to wrap it in `TypedHeader<>`. Callers _can_ still do that, + // but they aren't forced to. + let header = + as OptionalFromRequestParts>::from_request_parts(parts, state) + .await?; + + Ok(header.map(Self::from)) } } @@ -71,6 +93,13 @@ impl Deref for LastEventId { } } +impl From>> for LastEventId { + fn from(header: TypedHeader) -> Self { + let TypedHeader(value) = header; + value + } +} + impl From for LastEventId { fn from(value: T) -> Self { Self(value) diff --git a/src/invite/routes/mod.rs b/src/invite/routes/mod.rs index 2f7375c..a25dcd9 100644 --- a/src/invite/routes/mod.rs +++ b/src/invite/routes/mod.rs @@ -13,6 +13,6 @@ mod test; pub fn router() -> Router { Router::new() .route("/api/invite", post(post::handler)) - .route("/api/invite/:invite", get(invite::get::handler)) - .route("/api/invite/:invite", post(invite::post::handler)) + .route("/api/invite/{invite}", get(invite::get::handler)) + .route("/api/invite/{invite}", post(invite::post::handler)) } diff --git a/src/message/routes/mod.rs b/src/message/routes/mod.rs index dfe8628..85c192f 100644 --- a/src/message/routes/mod.rs +++ b/src/message/routes/mod.rs @@ -5,5 +5,5 @@ use crate::app::App; mod message; pub fn router() -> Router { - Router::new().route("/api/messages/:message", delete(message::delete::handler)) + Router::new().route("/api/messages/{message}", delete(message::delete::handler)) } diff --git a/src/token/extract/cookie.rs b/src/token/extract/cookie.rs index af5787d..df03aea 100644 --- a/src/token/extract/cookie.rs +++ b/src/token/extract/cookie.rs @@ -71,7 +71,6 @@ impl Identity { } } -#[async_trait::async_trait] impl FromRequestParts for Identity where S: Send + Sync, diff --git a/src/token/extract/identity.rs b/src/token/extract/identity.rs index a69f509..acfd7ae 100644 --- a/src/token/extract/identity.rs +++ b/src/token/extract/identity.rs @@ -1,5 +1,5 @@ use axum::{ - extract::{FromRequestParts, State}, + extract::{FromRequestParts, OptionalFromRequestParts, State}, http::request::Parts, response::{IntoResponse, Response}, }; @@ -20,7 +20,6 @@ pub struct Identity { pub login: Login, } -#[async_trait::async_trait] impl FromRequestParts for Identity { type Rejection = LoginError; @@ -39,6 +38,21 @@ impl FromRequestParts for Identity { } } +impl OptionalFromRequestParts for Identity { + type Rejection = LoginError; + + async fn from_request_parts( + parts: &mut Parts, + state: &App, + ) -> Result, Self::Rejection> { + match >::from_request_parts(parts, state).await { + Ok(identity) => Ok(Some(identity)), + Err(LoginError::Unauthorized) => Ok(None), + Err(other) => Err(other), + } + } +} + pub enum LoginError { Failure(E), Unauthorized, diff --git a/src/ui/routes/mod.rs b/src/ui/routes/mod.rs index 48b3f90..7877dba 100644 --- a/src/ui/routes/mod.rs +++ b/src/ui/routes/mod.rs @@ -13,14 +13,14 @@ mod setup; pub fn router(app: &App) -> Router { [ Router::new() - .route("/*path", get(path::get::handler)) + .route("/{*path}", get(path::get::handler)) .route("/setup", get(setup::get::handler)), Router::new() .route("/", get(get::handler)) .route("/me", get(me::get::handler)) .route("/login", get(login::get::handler)) - .route("/ch/:channel", get(ch::channel::get::handler)) - .route("/invite/:invite", get(invite::invite::get::handler)) + .route("/ch/{channel}", get(ch::channel::get::handler)) + .route("/invite/{invite}", get(invite::invite::get::handler)) .route_layer(middleware::from_fn_with_state(app.clone(), setup_required)), ] .into_iter() -- cgit v1.2.3