From 711ccbe0ee94ff6db2f88a3783b756395e0a0ee9 Mon Sep 17 00:00:00 2001 From: MasterPtato Date: Mon, 6 Oct 2025 17:00:40 -0700 Subject: [PATCH] fix(api): use custom path extractor --- packages/common/api-builder/src/extract.rs | 33 +++++++++++++++++-- packages/common/api-builder/src/wrappers.rs | 3 +- packages/core/api-public/src/actors/delete.rs | 3 +- .../core/api-public/src/runner_configs.rs | 3 +- packages/core/api-public/src/ui.rs | 2 +- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/packages/common/api-builder/src/extract.rs b/packages/common/api-builder/src/extract.rs index 1275526ce6..116034df9d 100644 --- a/packages/common/api-builder/src/extract.rs +++ b/packages/common/api-builder/src/extract.rs @@ -2,7 +2,7 @@ use anyhow::anyhow; use axum::{ extract::{ Request, - rejection::{ExtensionRejection, JsonRejection}, + rejection::{ExtensionRejection, JsonRejection, PathRejection}, {FromRequest, FromRequestParts}, }, response::IntoResponse, @@ -102,7 +102,36 @@ where .map(|ext| Extension(ext.0)) .map_err(|err| { ExtractorError( - anyhow!("developer error: extension error: {}", err.body_text()).into(), + ApiBadRequest { + reason: err.body_text(), + } + .build() + .into(), + ) + }) + } +} + +pub struct Path(pub T); + +impl FromRequestParts for Path +where + axum::extract::Path: FromRequestParts, + S: Send + Sync, +{ + type Rejection = ExtractorError; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + axum::extract::Path::::from_request_parts(parts, state) + .await + .map(|ext| Path(ext.0)) + .map_err(|err| { + ExtractorError( + ApiBadRequest { + reason: err.body_text(), + } + .build() + .into(), ) }) } diff --git a/packages/common/api-builder/src/wrappers.rs b/packages/common/api-builder/src/wrappers.rs index 7ce98b3669..13ba5e669f 100644 --- a/packages/common/api-builder/src/wrappers.rs +++ b/packages/common/api-builder/src/wrappers.rs @@ -1,7 +1,6 @@ use anyhow::Result; use axum::{ body::Bytes, - extract::Path, response::IntoResponse, routing::{ delete as axum_delete, get as axum_get, patch as axum_patch, post as axum_post, @@ -14,7 +13,7 @@ use std::future::Future; use crate::{ context::ApiCtx, error_response::ApiError, - extract::{Extension, Json, Query}, + extract::{Extension, Json, Path, Query}, }; /// Macro to generate wrapper functions for HTTP methods diff --git a/packages/core/api-public/src/actors/delete.rs b/packages/core/api-public/src/actors/delete.rs index 9cc24ab2ce..30fee5dc22 100644 --- a/packages/core/api-public/src/actors/delete.rs +++ b/packages/core/api-public/src/actors/delete.rs @@ -1,12 +1,11 @@ use anyhow::Result; use axum::{ - extract::Path, http::HeaderMap, response::{IntoResponse, Response}, }; use rivet_api_builder::{ ApiError, - extract::{Extension, Json, Query}, + extract::{Extension, Json, Path, Query}, }; use rivet_api_util::request_remote_datacenter_raw; use rivet_util::Id; diff --git a/packages/core/api-public/src/runner_configs.rs b/packages/core/api-public/src/runner_configs.rs index 0e9433b390..1267f93294 100644 --- a/packages/core/api-public/src/runner_configs.rs +++ b/packages/core/api-public/src/runner_configs.rs @@ -1,12 +1,11 @@ use anyhow::Result; use axum::{ - extract::Path, http::HeaderMap, response::{IntoResponse, Response}, }; use rivet_api_builder::{ ApiError, - extract::{Extension, Json, Query}, + extract::{Extension, Json, Path, Query}, }; use rivet_api_peer::runner_configs::*; diff --git a/packages/core/api-public/src/ui.rs b/packages/core/api-public/src/ui.rs index 8b1d58c81f..22698cbdb6 100644 --- a/packages/core/api-public/src/ui.rs +++ b/packages/core/api-public/src/ui.rs @@ -1,9 +1,9 @@ use axum::{ - extract::Path, http::{StatusCode, header}, response::{IntoResponse, Response}, }; use include_dir::{Dir, include_dir}; +use rivet_api_builder::extract::Path; static UI_DIR: Dir<'_> = include_dir!("$OUT_DIR/ui");