From d732269b8f0ec337a5492d97d048e85ab5d1097b Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Sun, 18 Feb 2024 09:45:27 -0800 Subject: [PATCH] backend proxy tests almost work! --- Cargo.toml | 1 + packages/cli/Cargo.toml | 2 +- packages/cli/src/cli/build.rs | 6 +- packages/cli/src/server/web/proxy.rs | 91 +++++++++++++------------- packages/fullstack/src/axum_adapter.rs | 3 +- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 89793fb74..c445d8edc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -119,6 +119,7 @@ serde = "1.0.61" axum_session = "0.12.1" axum_session_auth = "0.12.1" axum-extra = "0.9.2" +reqwest = "0.11.24" # This is a "virtual package" # It is not meant to be published, but is used so "cargo run --example XYZ" works properly diff --git a/packages/cli/Cargo.toml b/packages/cli/Cargo.toml index 4ea8613fb..a949b0ed0 100644 --- a/packages/cli/Cargo.toml +++ b/packages/cli/Cargo.toml @@ -49,7 +49,7 @@ walkdir = "2" # tools download dirs = "5.0.1" -reqwest = { version = "0.11", features = [ +reqwest = { workspace = true, features = [ "rustls-tls", "stream", "trust-dns", diff --git a/packages/cli/src/cli/build.rs b/packages/cli/src/cli/build.rs index 8c47fcda7..80962f005 100644 --- a/packages/cli/src/cli/build.rs +++ b/packages/cli/src/cli/build.rs @@ -1,6 +1,4 @@ use crate::assets::AssetConfigDropGuard; -#[cfg(feature = "plugin")] -use crate::plugin::PluginManager; use crate::server::fullstack; use dioxus_cli_config::Platform; @@ -55,7 +53,7 @@ impl Build { crate_config.set_cargo_args(self.build.cargo_args.clone()); // #[cfg(feature = "plugin")] - // let _ = PluginManager::on_build_start(&crate_config, &platform); + // let _ = crate::plugin::PluginManager::on_build_start(&crate_config, &platform); let build_result = match platform { Platform::Web => { @@ -116,7 +114,7 @@ impl Build { file.write_all(temp.as_bytes())?; // #[cfg(feature = "plugin")] - // let _ = PluginManager::on_build_finish(&crate_config, &platform); + // let _ = crate::plugin::PluginManager::on_build_finish(&crate_config, &platform); Ok(()) } diff --git a/packages/cli/src/server/web/proxy.rs b/packages/cli/src/server/web/proxy.rs index ee58dabe0..7f68346d7 100644 --- a/packages/cli/src/server/web/proxy.rs +++ b/packages/cli/src/server/web/proxy.rs @@ -102,30 +102,43 @@ mod test { use super::*; use axum::{extract::Path, Router}; - use axum_server::Server; + use axum_server::{Handle, Server}; - fn setup_servers( - mut config: WebProxyConfig, - ) -> ( - tokio::task::JoinHandle<()>, - tokio::task::JoinHandle<()>, - String, - ) { + async fn setup_servers(mut config: WebProxyConfig) -> String { let backend_router = Router::new().route( "/*path", any(|path: Path| async move { format!("backend: {}", path.0) }), ); - let backend_server = - Server::bind("127.0.0.1:0".parse().unwrap()).serve(backend_router.into_make_service()); - let backend_addr = backend_server.local_addr(); - let backend_handle = tokio::spawn(async move { backend_server.await.unwrap() }); - config.backend = format!("http://{}{}", backend_addr, config.backend); + + // The API backend server + let backend_handle_handle = Handle::new(); + let backend_handle_handle_ = backend_handle_handle.clone(); + tokio::spawn(async move { + Server::bind("127.0.0.1:0".parse().unwrap()) + .handle(backend_handle_handle_) + .serve(backend_router.into_make_service()) + .await + .unwrap(); + }); + + // Set the user's config to this dummy API we just built so we can test it + let backend_addr = backend_handle_handle.listening().await.unwrap(); + config.backend = dbg!(format!("http://{}{}", backend_addr, config.backend)); + + // Now set up our actual filesystem server let router = super::add_proxy(Router::new(), &config); - let server = - Server::bind("127.0.0.1:0".parse().unwrap()).serve(router.unwrap().into_make_service()); - let server_addr = server.local_addr(); - let server_handle = tokio::spawn(async move { server.await.unwrap() }); - (backend_handle, server_handle, server_addr.to_string()) + let server_handle_handle = Handle::new(); + let server_handle_handle_ = server_handle_handle.clone(); + tokio::spawn(async move { + Server::bind("127.0.0.1:0".parse().unwrap()) + .handle(server_handle_handle_) + .serve(router.unwrap().into_make_service()) + .await + .unwrap(); + }); + + // Expose *just* the fileystem web server's address + server_handle_handle.listening().await.unwrap().to_string() } async fn test_proxy_requests(path: String) { @@ -137,48 +150,38 @@ mod test { // So in day to day usage, use `http://localhost:8000/api` instead! backend: path, }; - let (backend_handle, server_handle, server_addr) = setup_servers(config).await; - let resp = Client::new() - .get(format!("http://{}/api", server_addr).parse().unwrap()) - .await - .unwrap(); - assert_eq!(resp.status(), StatusCode::OK); + + let server_addr = setup_servers(config).await; + assert_eq!( - axum::body::to_bytes(resp.into_body(), usize::MAX) + reqwest::get(format!("http://{}/api", server_addr)) + .await + .unwrap() + .text() .await .unwrap(), - "backend: /api" + "backend: api" ); - let resp = Client::new() - .get(format!("http://{}/api/", server_addr).parse().unwrap()) - .await - .unwrap(); - assert_eq!(resp.status(), StatusCode::OK); assert_eq!( - axum::body::to_bytes(resp.into_body(), usize::MAX) + reqwest::get(dbg!(format!("http://{}/api/", server_addr))) + .await + .unwrap() + .text() .await .unwrap(), "backend: /api/" ); - let resp = Client::new() - .get( - format!("http://{}/api/subpath", server_addr) - .parse() - .unwrap(), - ) - .await - .unwrap(); - assert_eq!(resp.status(), StatusCode::OK); assert_eq!( - axum::body::to_bytes(resp.into_body(), usize::MAX) + reqwest::get(format!("http://{}/api/subpath", server_addr)) + .await + .unwrap() + .text() .await .unwrap(), "backend: /api/subpath" ); - backend_handle.abort(); - server_handle.abort(); } #[tokio::test] diff --git a/packages/fullstack/src/axum_adapter.rs b/packages/fullstack/src/axum_adapter.rs index 07bd1ff2e..273abc3ec 100644 --- a/packages/fullstack/src/axum_adapter.rs +++ b/packages/fullstack/src/axum_adapter.rs @@ -68,7 +68,6 @@ use http::header::*; use server_fn::error::NoCustomError; use server_fn::error::ServerFnErrorSerde; use std::sync::Arc; -use std::sync::RwLock; use crate::{ prelude::*, render::SSRState, serve_config::ServeConfig, server_context::DioxusServerContext, @@ -478,7 +477,7 @@ async fn handle_server_fns_inner( get_local_pool().spawn_pinned(move || async move { let (parts, body) = req.into_parts(); let req = Request::from_parts(parts.clone(), body); - + let res = if let Some(mut service) = server_fn::axum::get_server_fn_service(&path_string)