From 11789ddfe36264bbbe7d596ab61e3fff855c3adb Mon Sep 17 00:00:00 2001 From: Amod Malviya Date: Sat, 19 Feb 2022 11:10:49 +0530 Subject: [PATCH] fix handling of unicode characters in URL --- Cargo.toml | 3 +++ README.md | 2 +- src/lib.rs | 8 ++++++-- src/macos.rs | 7 ++++++- tests/common.rs | 2 +- tests/test_macos.rs | 10 +++------- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9ddd54a..4cfcb70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,9 @@ keywords = ["webbrowser", "browser"] license = "MIT OR Apache-2.0" edition = "2018" +[dependencies] +url = "2" + [target.'cfg(target_arch = "wasm32")'.dependencies.web-sys] version = "0.3.36" features = [ diff --git a/README.md b/README.md index bce2430..9604218 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ if webbrowser::open("http://github.com").is_ok() { | Platform | Supported | Browsers | Test status | |----------|-----------|----------|-------------| -| macos | ✅ | default + [others](https://docs.rs/webbrowser/latest/webbrowser/enum.Browser.html) | ✅ (unencoded non-ascii URLs currently fail on Github, but work locally, so YMMV) | +| macos | ✅ | default + [others](https://docs.rs/webbrowser/latest/webbrowser/enum.Browser.html) | ✅ | | windows | ✅ | default only | ✅ | | linux/*bsd | ✅ | default only (respects $BROWSER env var, so can be used with other browsers) | ✅ | | android | ✅ | default only | ✅ | diff --git a/src/lib.rs b/src/lib.rs index 908527d..75fb153 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,7 @@ //! //! | Platform | Supported | Browsers | Test status | //! |----------|-----------|----------|-------------| -//! | macos | ✅ | default + [others](https://docs.rs/webbrowser/latest/webbrowser/enum.Browser.html) | ✅ (unencoded non-ascii URLs currently fail on Github, but work locally, so YMMV) | +//! | macos | ✅ | default + [others](https://docs.rs/webbrowser/latest/webbrowser/enum.Browser.html) | ✅ | //! | windows | ✅ | default only | ✅ | //! | linux/*bsd | ✅ | default only (respects $BROWSER env var, so can be used with other browsers) | ✅ | //! | android | ✅ | default only | ✅ | @@ -177,7 +177,11 @@ pub fn open(url: &str) -> Result<()> { /// } /// ``` pub fn open_browser(browser: Browser, url: &str) -> Result<()> { - os::open_browser_internal(browser, url) + let url_s: String = match url::Url::parse(url) { + Ok(u) => u.as_str().into(), + Err(_) => url.into(), + }; + os::open_browser_internal(browser, &url_s) } #[test] diff --git a/src/macos.rs b/src/macos.rs index 86ab2a8..e00f700 100644 --- a/src/macos.rs +++ b/src/macos.rs @@ -6,7 +6,12 @@ use common::from_status; /// Deal with opening of browsers on Mac OS X, using `open` command #[inline] -pub fn open_browser_internal(browser: Browser, url: &str) -> Result<()> { +pub fn open_browser_internal(browser: Browser, url_raw: &str) -> Result<()> { + let url_s: String = match url::Url::parse(url_raw) { + Ok(u) => u.as_str().into(), + Err(_) => url_raw.into(), + }; + let url = &url_s; let mut cmd = Command::new("open"); match browser { Browser::Default => from_status(cmd.arg(url).status()), diff --git a/tests/common.rs b/tests/common.rs index 7879520..21f6817 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -70,5 +70,5 @@ pub async fn check_request_received(browser: Browser, uri: String) { #[allow(dead_code)] pub async fn check_browser(browser: Browser, platform: &str) { check_request_received(browser, format!("/{}", platform)).await; - check_request_received(browser, format!("/{}/nonascii", platform)).await; + check_request_received(browser, format!("/{}/😀😀😀", platform)).await; } diff --git a/tests/test_macos.rs b/tests/test_macos.rs index eb8eaf4..f6c6f11 100644 --- a/tests/test_macos.rs +++ b/tests/test_macos.rs @@ -5,21 +5,17 @@ mod common; mod tests { const TEST_PLATFORM: &str = "macos"; - use super::common::{check_browser, check_request_received}; + use super::common::check_browser; use webbrowser::Browser; #[actix_rt::test] async fn test_open_default() { - // we've replaced check_browser with check_request_received as UTF-8 test fails currently - // check_browser(Browser::Default, TEST_PLATFORM).await; - check_request_received(Browser::Default, format!("/{}", TEST_PLATFORM)).await; + check_browser(Browser::Default, TEST_PLATFORM).await; } #[actix_rt::test] async fn test_open_safari() { - // we've replaced check_browser with check_request_received as UTF-8 test fails currently - // check_browser(Browser::Safari, TEST_PLATFORM).await; - check_request_received(Browser::Safari, format!("/{}", TEST_PLATFORM)).await; + check_browser(Browser::Safari, TEST_PLATFORM).await; } #[actix_rt::test]