diff --git a/src/engines.rs b/src/engines.rs index ae6fc51..78d8f8a 100644 --- a/src/engines.rs +++ b/src/engines.rs @@ -5,7 +5,7 @@ use axum::{ extract::{Request, State}, http::{StatusCode, Uri}, response::{IntoResponse, Response}, - Router, + Extension, Router, }; use log::*; use tower::Service; @@ -17,7 +17,7 @@ use crate::storage::DatabaseDriver; /// and the routers for each engine struct EngineMapperState { pool: DatabaseDriver, - kv_v2: Router, + kv_v2: Router, } /// Secret engine router @@ -52,9 +52,12 @@ async fn engine_handler( } /// Helper function to call the appropriate router with the request -async fn call_router(engine: Router, mount_path: String, req: Request) -> Response { +async fn call_router(engine: Router, mount_path: String, mut req: Request) -> Response { + let rui = req.uri().path().replace(&mount_path, "").parse().unwrap(); + *req.uri_mut() = rui; + engine - .with_state(mount_path) + .layer(Extension(mount_path)) .call(req) .await .into_response() diff --git a/src/engines/kv.rs b/src/engines/kv.rs index ca3e77b..91bae58 100644 --- a/src/engines/kv.rs +++ b/src/engines/kv.rs @@ -9,24 +9,26 @@ mod tests; use crate::engines::kv::structs::KvSecret; use crate::{engines::kv::logic::body_to_json, storage::DatabaseDriver}; +use axum::extract::State; +use axum::Extension; use axum::{extract::Path, routing::*, Router}; -pub fn kv_router(pool: DatabaseDriver) -> Router { +pub fn kv_router(pool: DatabaseDriver) -> Router { Router::new() - .route("/:mount_path/config", get(get_config)) - .route("/:mount_path/config", post(post_config)) - .route("/:mount_path/data/*path", get(get_data)) + .route("/config", get(get_config)) + .route("/config", post(post_config)) + .route("/data/*path", get(get_data)) // .route("/:mount_path/data/*path/", get(get_data)) - .route("/:mount_path/data/*path", post(post_data)) - .route("/:mount_path/data/*path", delete(delete_data)) - .route("/:mount_path/delete/*path", post(delete_path)) - .route("/:mount_path/destroy/*path", post(destroy_path)) - .route("/:mount_path/metadata/*path", get(get_meta)) + .route("/data/*path", post(post_data)) + .route("/data/*path", delete(delete_data)) + .route("/delete/*path", post(delete_path)) + .route("/destroy/*path", post(destroy_path)) + .route("/metadata/*path", get(get_meta)) // .route("/:mount_path/metadata/*path/", get(get_meta)) - .route("/:mount_path/metadata/*path", post(post_meta)) - .route("/:mount_path/metadata/*path", delete(delete_meta)) - .route("/:mount_path/subkeys/*path", get(get_subkeys)) - .route("/:mount_path/undelete/*path", post(post_undelete)) + .route("/metadata/*path", post(post_meta)) + .route("/metadata/*path", delete(delete_meta)) + .route("/subkeys/*path", get(get_subkeys)) + .route("/undelete/*path", post(post_undelete)) .with_state(pool) } @@ -43,7 +45,8 @@ async fn get_data() -> &'static str { } async fn post_data( - Path((mount_path, kv_path)): Path<(String, String)>, + Path(kv_path): Path, + Extension(mount_path): Extension, body: String, ) -> &'static str { let mut body_json = body_to_json(body); @@ -56,7 +59,7 @@ async fn post_data( "Secret: {}, Content: {}, Version: {}, path: {}", kv_path, secret.data, - secret.version.unwrap(), + secret.version.unwrap_or(0), mount_path, ); "RoutingTest foo successful"