diff --git a/Cargo.lock b/Cargo.lock index a3b1b7b32..3946586d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2275,6 +2275,7 @@ dependencies = [ "html_parser", "hyper 1.1.0", "hyper-rustls 0.26.0", + "hyper-util", "ignore", "indicatif", "interprocess-docfix", diff --git a/packages/cli/Cargo.toml b/packages/cli/Cargo.toml index 049bb195f..4ea8613fb 100644 --- a/packages/cli/Cargo.toml +++ b/packages/cli/Cargo.toml @@ -33,6 +33,7 @@ atty = "0.2.14" chrono = "0.4.19" anyhow = "1" hyper = { workspace = true } +hyper-util = "0.1.3" hyper-rustls = { workspace = true } indicatif = "0.17.5" subprocess = "0.2.9" diff --git a/packages/cli/src/server/web/hot_reload.rs b/packages/cli/src/server/web/hot_reload.rs index d55f1333d..277150fb1 100644 --- a/packages/cli/src/server/web/hot_reload.rs +++ b/packages/cli/src/server/web/hot_reload.rs @@ -4,11 +4,9 @@ use axum::{ response::IntoResponse, Extension, }; -use axum_extra::TypedHeader; pub async fn hot_reload_handler( ws: WebSocketUpgrade, - _: Option>, Extension(state): Extension, ) -> impl IntoResponse { ws.on_upgrade(|mut socket| async move { diff --git a/packages/cli/src/server/web/mod.rs b/packages/cli/src/server/web/mod.rs index 115310916..6fe190ad7 100644 --- a/packages/cli/src/server/web/mod.rs +++ b/packages/cli/src/server/web/mod.rs @@ -8,7 +8,7 @@ use crate::{ BuildResult, Result, }; use axum::{ - body::{Body, HttpBody}, + body::Body, extract::{ws::Message, Extension, WebSocketUpgrade}, http::{ self, @@ -19,8 +19,7 @@ use axum::{ routing::{get, get_service}, Router, }; -use axum_extra::TypedHeader; -use axum_server::{service::SendService, tls_rustls::RustlsConfig}; +use axum_server::tls_rustls::RustlsConfig; use dioxus_cli_config::CrateConfig; use dioxus_cli_config::WebHttpsConfig; @@ -299,9 +298,7 @@ async fn setup_router( .body(body) .unwrap() } else { - response.map(|body| body.try_into().unwrap()) - // response.into_body() - // response.map(|body| body.into()) + response.into_response() }; let headers = response.headers_mut(); headers.insert( @@ -316,7 +313,7 @@ async fn setup_router( .service(ServeDir::new(config.out_dir())); // Setup websocket - let mut router = Router::new().route("/_dioxus/ws", get(ws_handler.into())); + let mut router = Router::new().route("/_dioxus/ws", get(ws_handler)); // Setup proxy for proxy_config in config.dioxus_config.web.proxy { @@ -324,8 +321,8 @@ async fn setup_router( } // Route file service - router = router.fallback(get_service(file_service.into_service()).handle_error( - |error: std::io::Error| async move { + router = router.fallback(get_service(file_service).handle_error( + |error: std::convert::Infallible| async move { ( StatusCode::INTERNAL_SERVER_ERROR, format!("Unhandled internal error: {}", error), @@ -336,7 +333,7 @@ async fn setup_router( router = if let Some(base_path) = config.dioxus_config.web.app.base_path.clone() { let base_path = format!("/{}", base_path.trim_matches('/')); Router::new() - .route(&base_path, axum::routing::any_service(router.into())) + .route(&base_path, axum::routing::any_service(router)) .fallback(get(move || { let base_path = base_path.clone(); async move { format!("Outside of the base path: {}", base_path) } @@ -347,7 +344,7 @@ async fn setup_router( // Setup routes router = router - .route("/_dioxus/hot_reload", get(hot_reload_handler.into())) + .route("/_dioxus/hot_reload", get(hot_reload_handler)) .layer(cors) .layer(Extension(ws_reload)); @@ -418,7 +415,6 @@ fn get_ip() -> Option { /// Handle websockets async fn ws_handler( ws: WebSocketUpgrade, - _: Option>, Extension(state): Extension>, ) -> impl IntoResponse { ws.on_upgrade(|mut socket| async move { diff --git a/packages/cli/src/server/web/proxy.rs b/packages/cli/src/server/web/proxy.rs index facb9dce8..ee58dabe0 100644 --- a/packages/cli/src/server/web/proxy.rs +++ b/packages/cli/src/server/web/proxy.rs @@ -1,16 +1,19 @@ use crate::Result; use dioxus_cli_config::WebProxyConfig; -use anyhow::Context; +use anyhow::{anyhow, Context}; use axum::{http::StatusCode, routing::any, Router}; use hyper::{Request, Response, Uri}; -use hyper::client::legacy::Client; +use hyper_util::{ + client::legacy::{self, connect::HttpConnector}, + rt::TokioExecutor, +}; use axum::body::Body as MyBody; #[derive(Debug, Clone)] struct ProxyClient { - inner: Client>, + inner: legacy::Client, MyBody>, url: Uri, } @@ -23,12 +26,12 @@ impl ProxyClient { .enable_http1() .build(); Self { - inner: Client::builder().build(https), + inner: legacy::Client::builder(TokioExecutor::new()).build(https), url, } } - async fn send(&self, mut req: Request) -> Result> { + async fn send(&self, mut req: Request) -> Result> { let mut uri_parts = req.uri().clone().into_parts(); uri_parts.authority = self.url.authority().cloned(); uri_parts.scheme = self.url.scheme().cloned(); @@ -36,7 +39,7 @@ impl ProxyClient { self.inner .request(req) .await - .map_err(crate::error::Error::ProxyRequestError) + .map_err(|err| crate::error::Error::Other(anyhow!(err))) } } @@ -112,14 +115,14 @@ mod test { "/*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_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); 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 = + 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()) diff --git a/packages/fullstack/src/axum_adapter.rs b/packages/fullstack/src/axum_adapter.rs index 3fc4a138b..3ccef1403 100644 --- a/packages/fullstack/src/axum_adapter.rs +++ b/packages/fullstack/src/axum_adapter.rs @@ -54,6 +54,7 @@ //! } //! ``` +use axum::routing::*; use axum::{ body::{self, Body}, extract::State, @@ -63,12 +64,11 @@ use axum::{ Router, }; use dioxus_lib::prelude::VirtualDom; +use http::header::*; use server_fn::error::NoCustomError; use server_fn::error::ServerFnErrorSerde; use std::sync::Arc; use std::sync::RwLock; -use axum::routing::*; -use http::header::*; use crate::{ prelude::*, render::SSRState, serve_config::ServeConfig, server_context::DioxusServerContext, @@ -196,12 +196,12 @@ where for (path, method) in server_fn::axum::server_fn_paths() { tracing::trace!("Registering server function: {} {}", method, path); - let handler = move |req| handle_server_fns_inner(path, ||{}, req); + let handler = move |req| handle_server_fns_inner(path, || {}, req); self = match method { Method::GET => self.route(path, get(handler)), Method::POST => self.route(path, post(handler)), Method::PUT => self.route(path, put(handler)), - _ => todo!() + _ => todo!(), }; } @@ -548,4 +548,4 @@ async fn handle_server_fns_inner( ) .into_response() }) -} \ No newline at end of file +} diff --git a/packages/fullstack/src/lib.rs b/packages/fullstack/src/lib.rs index d13fcb695..288d32b54 100644 --- a/packages/fullstack/src/lib.rs +++ b/packages/fullstack/src/lib.rs @@ -20,7 +20,6 @@ pub mod launch; mod hot_reload; pub use config::*; - #[cfg(feature = "server")] mod render; @@ -73,8 +72,8 @@ pub mod prelude { #[cfg_attr(docsrs, doc(cfg(feature = "server")))] pub use dioxus_ssr::incremental::IncrementalRendererConfig; - pub use server_fn::{self, ServerFn as _, ServerFnError}; pub use dioxus_server_macro::*; + pub use server_fn::{self, ServerFn as _, ServerFnError}; } // // Warn users about overlapping features diff --git a/packages/server-macro/src/lib.rs b/packages/server-macro/src/lib.rs index 497297950..97f9b0675 100644 --- a/packages/server-macro/src/lib.rs +++ b/packages/server-macro/src/lib.rs @@ -70,15 +70,15 @@ use syn::__private::ToTokens; /// ``` #[proc_macro_attribute] pub fn server(args: proc_macro::TokenStream, s: TokenStream) -> TokenStream { - match server_macro_impl( - args.into(), - s.into(), - Some(syn::parse_quote!(server_fn)), - "/api", - None, - None, - ) { - Err(e) => e.to_compile_error().into(), - Ok(s) => s.to_token_stream().into(), - } + match server_macro_impl( + args.into(), + s.into(), + Some(syn::parse_quote!(server_fn)), + "/api", + None, + None, + ) { + Err(e) => e.to_compile_error().into(), + Ok(s) => s.to_token_stream().into(), + } }