From 6766082536be30e0e61841d7c500e3d4c76ddc11 Mon Sep 17 00:00:00 2001 From: Greg Johnston Date: Sat, 10 Feb 2024 14:58:57 -0500 Subject: [PATCH] fix: correctly handle external origins in redirect hook (closes #2269) --- router/src/components/router.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/router/src/components/router.rs b/router/src/components/router.rs index 55056a7b2..48f71c18b 100644 --- a/router/src/components/router.rs +++ b/router/src/components/router.rs @@ -58,13 +58,25 @@ pub fn Router( let navigate = SendWrapper::new(navigate); let router_hook = Box::new(move |path: &str| { let path = path.to_string(); + let Ok(origin) = window().location().origin() else { + return; + }; + let Ok(to_url) = web_sys::Url::new_with_base(&path, &origin) else { + logging::error!("could not parse url {path:?}"); + return; + }; + let to_origin = to_url.origin(); // delay by a tick here, so that the Action updates *before* the redirect - request_animation_frame({ - let navigate = navigate.clone(); - move || { - navigate(&path, Default::default()); - } - }); + if to_origin != origin { + _ = window().location().set_href(&path); + } else { + request_animation_frame({ + let navigate = navigate.clone(); + move || { + navigate(&path, Default::default()); + } + }); + } }) as RedirectHook; _ = server_fn::redirect::set_redirect_hook(router_hook);