summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-04-03 18:12:38 +0530
committerGitHub <noreply@github.com>2022-04-03 18:12:38 +0530
commit1f7dd5eda9b5e17ff102abb4dce1f19a4ce76688 (patch)
tree4e4463a211d877188f242b83cbe44d09fa829386
parenta6e4b4297d840e9cfe4bdf373f24da8202f58e2d (diff)
chore(ext/url): cleanup url ops (#14177)
-rw-r--r--ext/url/00_url.js18
-rw-r--r--ext/url/lib.rs85
2 files changed, 42 insertions, 61 deletions
diff --git a/ext/url/00_url.js b/ext/url/00_url.js
index b83cdd17d..ab3488455 100644
--- a/ext/url/00_url.js
+++ b/ext/url/00_url.js
@@ -30,15 +30,15 @@
const _urlObject = Symbol("url object");
// WARNING: must match rust code's UrlSetter::*
- const SET_HASH = 1;
- const SET_HOST = 2;
- const SET_HOSTNAME = 3;
- const SET_PASSWORD = 4;
- const SET_PATHNAME = 5;
- const SET_PORT = 6;
- const SET_PROTOCOL = 7;
- const SET_SEARCH = 8;
- const SET_USERNAME = 9;
+ const SET_HASH = 0;
+ const SET_HOST = 1;
+ const SET_HOSTNAME = 2;
+ const SET_PASSWORD = 3;
+ const SET_PATHNAME = 4;
+ const SET_PORT = 5;
+ const SET_PROTOCOL = 6;
+ const SET_SEARCH = 7;
+ const SET_USERNAME = 8;
// Helper functions
function opUrlReparse(href, setter, value) {
diff --git a/ext/url/lib.rs b/ext/url/lib.rs
index 46e363bc3..394fd5902 100644
--- a/ext/url/lib.rs
+++ b/ext/url/lib.rs
@@ -2,7 +2,6 @@
mod urlpattern;
-use deno_core::error::generic_error;
use deno_core::error::type_error;
use deno_core::error::uri_error;
use deno_core::error::AnyError;
@@ -13,7 +12,6 @@ use deno_core::url::quirks;
use deno_core::url::Url;
use deno_core::Extension;
use deno_core::ZeroCopyBuf;
-use std::panic::catch_unwind;
use std::path::PathBuf;
use crate::urlpattern::op_urlpattern_parse;
@@ -71,37 +69,39 @@ pub fn op_url_parse(
.parse(&href)
.map_err(|_| type_error("Invalid URL"))?;
- url_result(url, href, base_href)
+ Ok(url_parts(url))
}
-#[derive(
- serde_repr::Serialize_repr, serde_repr::Deserialize_repr, PartialEq, Debug,
-)]
+#[derive(PartialEq, Debug)]
#[repr(u8)]
pub enum UrlSetter {
- Hash = 1,
- Host = 2,
- Hostname = 3,
- Password = 4,
- Pathname = 5,
- Port = 6,
- Protocol = 7,
- Search = 8,
- Username = 9,
+ Hash = 0,
+ Host = 1,
+ Hostname = 2,
+ Password = 3,
+ Pathname = 4,
+ Port = 5,
+ Protocol = 6,
+ Search = 7,
+ Username = 8,
}
#[op]
pub fn op_url_reparse(
href: String,
- setter_opts: (UrlSetter, String),
+ setter_opts: (u8, String),
) -> Result<UrlParts, AnyError> {
let mut url = Url::options()
.parse(&href)
.map_err(|_| type_error("Invalid URL"))?;
let (setter, setter_value) = setter_opts;
+ if setter > 8 {
+ return Err(type_error("Invalid URL setter"));
+ }
+ // SAFETY: checked to be less than 9.
+ let setter = unsafe { std::mem::transmute::<u8, UrlSetter>(setter) };
let value = setter_value.as_ref();
-
match setter {
UrlSetter::Hash => quirks::set_hash(&mut url, value),
UrlSetter::Host => quirks::set_host(&mut url, value)
@@ -120,43 +120,24 @@ pub fn op_url_reparse(
.map_err(|_| uri_error("Invalid username"))?,
}
- url_result(url, href, None)
+ Ok(url_parts(url))
}
-fn url_result(
- url: Url,
- href: String,
- base_href: Option<String>,
-) -> Result<UrlParts, AnyError> {
- // TODO(nayeemrmn): Panic that occurs in rust-url for the `non-spec:`
- // url-constructor wpt tests: https://github.com/servo/rust-url/issues/670.
- let username = catch_unwind(|| quirks::username(&url)).map_err(|_| {
- generic_error(format!(
- "Internal error while parsing \"{}\"{}, \
- see https://github.com/servo/rust-url/issues/670",
- href,
- base_href
- .map(|b| format!(" against \"{}\"", b))
- .unwrap_or_default()
- ))
- })?;
-
- Ok(
- [
- quirks::href(&url),
- quirks::hash(&url),
- quirks::host(&url),
- quirks::hostname(&url),
- &quirks::origin(&url),
- quirks::password(&url),
- quirks::pathname(&url),
- quirks::port(&url),
- quirks::protocol(&url),
- quirks::search(&url),
- username,
- ]
- .join("\n"),
- )
+fn url_parts(url: Url) -> UrlParts {
+ [
+ quirks::href(&url),
+ quirks::hash(&url),
+ quirks::host(&url),
+ quirks::hostname(&url),
+ &quirks::origin(&url),
+ quirks::password(&url),
+ quirks::pathname(&url),
+ quirks::port(&url),
+ quirks::protocol(&url),
+ quirks::search(&url),
+ quirks::username(&url),
+ ]
+ .join("\n")
}
#[op]