summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock49
-rw-r--r--Cargo.toml4
-rw-r--r--src/channel/routes/mod.rs4
-rw-r--r--src/clock.rs1
-rw-r--r--src/event/extract.rs41
-rw-r--r--src/invite/routes/mod.rs4
-rw-r--r--src/message/routes/mod.rs2
-rw-r--r--src/token/extract/cookie.rs1
-rw-r--r--src/token/extract/identity.rs18
-rw-r--r--src/ui/routes/mod.rs6
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",
@@ -519,15 +518,6 @@ dependencies = [
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -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"
@@ -1265,23 +1255,6 @@ dependencies = [
]
[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
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<App> {
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<S> FromRequestParts<S> 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<S, T> FromRequestParts<S> for LastEventId<T>
where
S: Send + Sync,
@@ -53,12 +52,35 @@ where
type Rejection = <TypedHeader<Self> as FromRequestParts<S>>::Rejection;
async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
- // 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 =
+ <TypedHeader<Self> as FromRequestParts<S>>::from_request_parts(parts, state).await?;
- Ok(requested_at)
+ Ok(header.into())
+ }
+}
+
+impl<S, T> OptionalFromRequestParts<S> for LastEventId<T>
+where
+ S: Send + Sync,
+ T: Serialize + DeserializeOwned,
+{
+ type Rejection = <TypedHeader<Self> as FromRequestParts<S>>::Rejection;
+
+ async fn from_request_parts(
+ parts: &mut Parts,
+ state: &S,
+ ) -> Result<Option<Self>, Self::Rejection> {
+ // This is purely for ergonomics: it allows `Option<LastEventId>` to be extracted
+ // without having to wrap it in `TypedHeader<>`. Callers _can_ still do that,
+ // but they aren't forced to.
+ let header =
+ <TypedHeader<Self> as OptionalFromRequestParts<S>>::from_request_parts(parts, state)
+ .await?;
+
+ Ok(header.map(Self::from))
}
}
@@ -71,6 +93,13 @@ impl<T> Deref for LastEventId<T> {
}
}
+impl<T> From<TypedHeader<LastEventId<T>>> for LastEventId<T> {
+ fn from(header: TypedHeader<Self>) -> Self {
+ let TypedHeader(value) = header;
+ value
+ }
+}
+
impl<T> From<T> for LastEventId<T> {
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<App> {
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<App> {
- 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<S> FromRequestParts<S> 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<App> for Identity {
type Rejection = LoginError<Internal>;
@@ -39,6 +38,21 @@ impl FromRequestParts<App> for Identity {
}
}
+impl OptionalFromRequestParts<App> for Identity {
+ type Rejection = LoginError<Internal>;
+
+ async fn from_request_parts(
+ parts: &mut Parts,
+ state: &App,
+ ) -> Result<Option<Self>, Self::Rejection> {
+ match <Self as FromRequestParts<App>>::from_request_parts(parts, state).await {
+ Ok(identity) => Ok(Some(identity)),
+ Err(LoginError::Unauthorized) => Ok(None),
+ Err(other) => Err(other),
+ }
+ }
+}
+
pub enum LoginError<E> {
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<App> {
[
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()