diff --git a/idna/src/uts46.rs b/idna/src/uts46.rs index b082416c8..d52a4d0fb 100644 --- a/idna/src/uts46.rs +++ b/idna/src/uts46.rs @@ -475,7 +475,7 @@ impl Idna { errors } - /// http://www.unicode.org/reports/tr46/#ToASCII + /// #[allow(clippy::wrong_self_convention)] pub fn to_ascii(&mut self, domain: &str, out: &mut String) -> Result<(), Errors> { let mut errors = self.to_ascii_inner(domain, out); @@ -497,7 +497,7 @@ impl Idna { errors.into() } - /// http://www.unicode.org/reports/tr46/#ToUnicode + /// #[allow(clippy::wrong_self_convention)] pub fn to_unicode(&mut self, domain: &str, out: &mut String) -> Result<(), Errors> { if is_simple(domain) { @@ -518,7 +518,7 @@ pub struct Config { use_idna_2008_rules: bool, } -/// The defaults are that of https://url.spec.whatwg.org/#idna +/// The defaults are that of impl Default for Config { fn default() -> Self { Config { @@ -566,14 +566,14 @@ impl Config { self } - /// http://www.unicode.org/reports/tr46/#ToASCII + /// pub fn to_ascii(self, domain: &str) -> Result { let mut result = String::with_capacity(domain.len()); let mut codec = Idna::new(self); codec.to_ascii(domain, &mut result).map(|()| result) } - /// http://www.unicode.org/reports/tr46/#ToUnicode + /// pub fn to_unicode(self, domain: &str) -> (String, Result<(), Errors>) { let mut codec = Idna::new(self); let mut out = String::with_capacity(domain.len()); diff --git a/percent_encoding/src/lib.rs b/percent_encoding/src/lib.rs index e02a43949..77a1f5bb9 100644 --- a/percent_encoding/src/lib.rs +++ b/percent_encoding/src/lib.rs @@ -116,6 +116,125 @@ pub const CONTROLS: &AsciiSet = &AsciiSet { ], }; +/// The fragment percent-encode set. +/// +/// The C0 control percent-encode set and U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), and U+0060 (`). +/// +/// +pub const FRAGMENT: &AsciiSet = &CONTROLS + // U+0020 SPACE + .add(b' ') + // U+0022 (") + .add(b'"') + // U+003C (<) + .add(b'<') + // U+003E (>) + .add(b'>') + // U+0060 (`) + .add(b'`'); + +/// The query percent-encode set. +/// +/// The C0 control percent-encode set and U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), and U+003E (>). +/// +/// +pub const QUERY: &AsciiSet = &CONTROLS + // U+0020 SPACE + .add(b' ') + // U+0022 (") + .add(b'"') + // U+0023 (#) + .add(b'#') + // U+003C (<) + .add(b'<') + // U+003E (>) + .add(b'>'); + +/// The special-query percent-encode set. +/// +/// The query percent-encode set and U+0027 ('). +/// +/// +pub const SPECIAL_QUERY: &AsciiSet = &QUERY + // U+0027 (') + .add(b'\''); + +/// The path percent-encode set. +/// +/// The query percent-encode set and U+003F (?), U+0060 (`), U+007B ({), and U+007D (}). +/// +/// +pub const PATH: &AsciiSet = &QUERY + // U+003F (?) + .add(b'?') + // U+0060 (`) + .add(b'`') + // U+007B ({) + .add(b'{') + // U+007D (}) + .add(b'}'); + +/// The userinfo percent-encode set. +/// +/// The path percent-encode set and U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), U+005B ([) to U+005E (^), inclusive, and U+007C (|). +/// +/// +pub const USERINFO: &AsciiSet = &PATH + // U+002F (/) + .add(b'/') + // U+003A (:) + .add(b':') + // U+003B (;) + .add(b';') + // U+003D (=) + .add(b'=') + // U+0040 (@) + .add(b'@') + // U+005B ([) + .add(b'[') + // U+005C (\) + .add(b'\\') + // U+005D (]) + .add(b']') + // U+005E (^) + .add(b'^') + // U+007C (|) + .add(b'|'); + +/// The component percent-encode set. +/// +/// The userinfo percent-encode set and U+0024 ($) to U+0026 (&), inclusive, U+002B (+), and U+002C (,). +/// +/// +pub const COMPONENT: &AsciiSet = &USERINFO + // U+0024 ($) + .add(b'$') + // U+0025 (%) + .add(b'%') + // U+0026 (&) + .add(b'&') + // U+002B (+) + .add(b'+') + // U+002C (,) + .add(b','); + +/// The `application/x-www-form-urlencoded` percent-encode set. +/// +/// The component percent-encode set and U+0021 (!), U+0027 (') to U+0029 RIGHT PARENTHESIS, inclusive, and U+007E (~). +/// +/// +pub const FORM: &AsciiSet = &COMPONENT + // U+0021 (!) + .add(b'!') + // U+0027 (') + .add(b'\'') + // U+0028 LEFT PARENTHESIS + .add(b'(') + // U+0029 RIGHT PARENTHESIS + .add(b')') + // and U+007E (~) + .add(b'~'); + macro_rules! static_assert { ($( $bool: expr, )+) => { fn _static_assert() { diff --git a/url/src/lib.rs b/url/src/lib.rs index 78980e85f..8d6ff97b8 100644 --- a/url/src/lib.rs +++ b/url/src/lib.rs @@ -146,10 +146,8 @@ pub use form_urlencoded; extern crate serde; use crate::host::HostInternal; -use crate::parser::{ - to_u32, Context, Parser, SchemeType, PATH_SEGMENT, SPECIAL_PATH_SEGMENT, USERINFO, -}; -use percent_encoding::{percent_decode, percent_encode, utf8_percent_encode}; +use crate::parser::{to_u32, Context, Parser, SchemeType, PATH_SEGMENT, SPECIAL_PATH_SEGMENT}; +use percent_encoding::{percent_decode, percent_encode, utf8_percent_encode, USERINFO}; use std::borrow::Borrow; use std::cmp; use std::fmt::{self, Write}; diff --git a/url/src/parser.rs b/url/src/parser.rs index 7d94d1d71..bad104493 100644 --- a/url/src/parser.rs +++ b/url/src/parser.rs @@ -13,26 +13,9 @@ use std::str; use crate::host::{Host, HostInternal}; use crate::Url; use form_urlencoded::EncodingOverride; -use percent_encoding::{percent_encode, utf8_percent_encode, AsciiSet, CONTROLS}; - -/// https://url.spec.whatwg.org/#fragment-percent-encode-set -const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`'); - -/// https://url.spec.whatwg.org/#path-percent-encode-set -const PATH: &AsciiSet = &FRAGMENT.add(b'#').add(b'?').add(b'{').add(b'}'); - -/// https://url.spec.whatwg.org/#userinfo-percent-encode-set -pub(crate) const USERINFO: &AsciiSet = &PATH - .add(b'/') - .add(b':') - .add(b';') - .add(b'=') - .add(b'@') - .add(b'[') - .add(b'\\') - .add(b']') - .add(b'^') - .add(b'|'); +use percent_encoding::{ + percent_encode, utf8_percent_encode, AsciiSet, CONTROLS, FRAGMENT, PATH, USERINFO, +}; pub(crate) const PATH_SEGMENT: &AsciiSet = &PATH.add(b'/').add(b'%'); diff --git a/url/src/quirks.rs b/url/src/quirks.rs index 3a99e22cf..87bb494b5 100644 --- a/url/src/quirks.rs +++ b/url/src/quirks.rs @@ -6,7 +6,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//! Getters and setters for URL components implemented per https://url.spec.whatwg.org/#api +//! Getters and setters for URL components implemented per //! //! Unless you need to be interoperable with web browsers, //! you probably want to use `Url` method instead. @@ -57,7 +57,7 @@ pub fn internal_components(url: &Url) -> InternalComponents { } } -/// https://url.spec.whatwg.org/#dom-url-domaintoascii +/// pub fn domain_to_ascii(domain: &str) -> String { match Host::parse(domain) { Ok(Host::Domain(domain)) => domain, @@ -65,7 +65,7 @@ pub fn domain_to_ascii(domain: &str) -> String { } } -/// https://url.spec.whatwg.org/#dom-url-domaintounicode +/// pub fn domain_to_unicode(domain: &str) -> String { match Host::parse(domain) { Ok(Host::Domain(ref domain)) => { @@ -76,29 +76,29 @@ pub fn domain_to_unicode(domain: &str) -> String { } } -/// Getter for https://url.spec.whatwg.org/#dom-url-href +/// Getter for pub fn href(url: &Url) -> &str { url.as_str() } -/// Setter for https://url.spec.whatwg.org/#dom-url-href +/// Setter for pub fn set_href(url: &mut Url, value: &str) -> Result<(), ParseError> { *url = Url::parse(value)?; Ok(()) } -/// Getter for https://url.spec.whatwg.org/#dom-url-origin +/// Getter for pub fn origin(url: &Url) -> String { url.origin().ascii_serialization() } -/// Getter for https://url.spec.whatwg.org/#dom-url-protocol +/// Getter for #[inline] pub fn protocol(url: &Url) -> &str { &url.as_str()[..url.scheme().len() + ":".len()] } -/// Setter for https://url.spec.whatwg.org/#dom-url-protocol +/// Setter for #[allow(clippy::result_unit_err)] pub fn set_protocol(url: &mut Url, mut new_protocol: &str) -> Result<(), ()> { // The scheme state in the spec ignores everything after the first `:`, @@ -109,25 +109,25 @@ pub fn set_protocol(url: &mut Url, mut new_protocol: &str) -> Result<(), ()> { url.set_scheme(new_protocol) } -/// Getter for https://url.spec.whatwg.org/#dom-url-username +/// Getter for #[inline] pub fn username(url: &Url) -> &str { url.username() } -/// Setter for https://url.spec.whatwg.org/#dom-url-username +/// Setter for #[allow(clippy::result_unit_err)] pub fn set_username(url: &mut Url, new_username: &str) -> Result<(), ()> { url.set_username(new_username) } -/// Getter for https://url.spec.whatwg.org/#dom-url-password +/// Getter for #[inline] pub fn password(url: &Url) -> &str { url.password().unwrap_or("") } -/// Setter for https://url.spec.whatwg.org/#dom-url-password +/// Setter for #[allow(clippy::result_unit_err)] pub fn set_password(url: &mut Url, new_password: &str) -> Result<(), ()> { url.set_password(if new_password.is_empty() { @@ -137,13 +137,13 @@ pub fn set_password(url: &mut Url, new_password: &str) -> Result<(), ()> { }) } -/// Getter for https://url.spec.whatwg.org/#dom-url-host +/// Getter for #[inline] pub fn host(url: &Url) -> &str { &url[Position::BeforeHost..Position::AfterPort] } -/// Setter for https://url.spec.whatwg.org/#dom-url-host +/// Setter for #[allow(clippy::result_unit_err)] pub fn set_host(url: &mut Url, new_host: &str) -> Result<(), ()> { // If context object’s url’s cannot-be-a-base-URL flag is set, then return. @@ -190,13 +190,13 @@ pub fn set_host(url: &mut Url, new_host: &str) -> Result<(), ()> { Ok(()) } -/// Getter for https://url.spec.whatwg.org/#dom-url-hostname +/// Getter for #[inline] pub fn hostname(url: &Url) -> &str { url.host_str().unwrap_or("") } -/// Setter for https://url.spec.whatwg.org/#dom-url-hostname +/// Setter for #[allow(clippy::result_unit_err)] pub fn set_hostname(url: &mut Url, new_hostname: &str) -> Result<(), ()> { if url.cannot_be_a_base() { @@ -232,13 +232,13 @@ pub fn set_hostname(url: &mut Url, new_hostname: &str) -> Result<(), ()> { } } -/// Getter for https://url.spec.whatwg.org/#dom-url-port +/// Getter for #[inline] pub fn port(url: &Url) -> &str { &url[Position::BeforePort..Position::AfterPort] } -/// Setter for https://url.spec.whatwg.org/#dom-url-port +/// Setter for #[allow(clippy::result_unit_err)] pub fn set_port(url: &mut Url, new_port: &str) -> Result<(), ()> { let result; @@ -262,13 +262,13 @@ pub fn set_port(url: &mut Url, new_port: &str) -> Result<(), ()> { } } -/// Getter for https://url.spec.whatwg.org/#dom-url-pathname +/// Getter for #[inline] pub fn pathname(url: &Url) -> &str { url.path() } -/// Setter for https://url.spec.whatwg.org/#dom-url-pathname +/// Setter for pub fn set_pathname(url: &mut Url, new_pathname: &str) { if url.cannot_be_a_base() { return; @@ -286,12 +286,12 @@ pub fn set_pathname(url: &mut Url, new_pathname: &str) { } } -/// Getter for https://url.spec.whatwg.org/#dom-url-search +/// Getter for pub fn search(url: &Url) -> &str { trim(&url[Position::AfterPath..Position::AfterQuery]) } -/// Setter for https://url.spec.whatwg.org/#dom-url-search +/// Setter for pub fn set_search(url: &mut Url, new_search: &str) { url.set_query(match new_search { "" => None, @@ -300,12 +300,12 @@ pub fn set_search(url: &mut Url, new_search: &str) { }) } -/// Getter for https://url.spec.whatwg.org/#dom-url-hash +/// Getter for pub fn hash(url: &Url) -> &str { trim(&url[Position::AfterQuery..]) } -/// Setter for https://url.spec.whatwg.org/#dom-url-hash +/// Setter for pub fn set_hash(url: &mut Url, new_hash: &str) { url.set_fragment(match new_hash { // If the given value is the empty string,