Skip to content

Commit

Permalink
Merge commit 'refs/pull/484/head' of github.com:servo/rust-url into 2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonSapin committed Jul 17, 2019
2 parents da2b1af + 38cfea4 commit b2b70f5
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 56 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ serde_json = "1.0"
bencher = "0.1"

[dependencies]
idna = { version = "0.1.0", path = "./idna" }
idna = { version = "0.2.0", path = "./idna" }
matches = "0.1"
percent-encoding = { version = "1.0.0", path = "./percent_encoding" }
serde = {version = "1.0", optional = true}
Expand Down
2 changes: 1 addition & 1 deletion idna/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "idna"
version = "0.1.6"
version = "0.2.0"
authors = ["The rust-url developers"]
description = "IDNA (Internationalizing Domain Names in Applications) and Punycode."
repository = "https://github.com/servo/rust-url/"
Expand Down
16 changes: 2 additions & 14 deletions idna/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,7 @@ pub mod uts46;
///
/// This process may fail.
pub fn domain_to_ascii(domain: &str) -> Result<String, uts46::Errors> {
let flags = uts46::Flags {
use_std3_ascii_rules: false,
transitional_processing: false,
verify_dns_length: false,
};
uts46::Config::from(flags).check_hyphens(false).to_ascii(domain)
uts46::Config::default().to_ascii(domain)
}

/// The [domain to Unicode](https://url.spec.whatwg.org/#concept-domain-to-unicode) algorithm.
Expand All @@ -65,12 +60,5 @@ pub fn domain_to_ascii(domain: &str) -> Result<String, uts46::Errors> {
/// This may indicate [syntax violations](https://url.spec.whatwg.org/#syntax-violation)
/// but always returns a string for the mapped domain.
pub fn domain_to_unicode(domain: &str) -> (String, Result<(), uts46::Errors>) {
let flags = uts46::Flags {
use_std3_ascii_rules: false,

// Unused:
transitional_processing: false,
verify_dns_length: false,
};
uts46::Config::from(flags).check_hyphens(false).to_unicode(domain)
uts46::Config::default().to_unicode(domain)
}
55 changes: 15 additions & 40 deletions idna/src/uts46.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,13 @@ fn find_char(codepoint: char) -> &'static Mapping {
.unwrap()
}

fn map_char(codepoint: char, flags: Flags, output: &mut String, errors: &mut Vec<Error>) {
fn map_char(codepoint: char, config: Config, output: &mut String, errors: &mut Vec<Error>) {
match *find_char(codepoint) {
Mapping::Valid => output.push(codepoint),
Mapping::Ignored => {}
Mapping::Mapped(ref slice) => output.push_str(decode_slice(slice)),
Mapping::Deviation(ref slice) => {
if flags.transitional_processing {
if config.transitional_processing {
output.push_str(decode_slice(slice))
} else {
output.push(codepoint)
Expand All @@ -98,13 +98,13 @@ fn map_char(codepoint: char, flags: Flags, output: &mut String, errors: &mut Vec
output.push(codepoint);
}
Mapping::DisallowedStd3Valid => {
if flags.use_std3_ascii_rules {
if config.use_std3_ascii_rules {
errors.push(Error::DissallowedByStd3AsciiRules);
}
output.push(codepoint)
}
Mapping::DisallowedStd3Mapped(ref slice) => {
if flags.use_std3_ascii_rules {
if config.use_std3_ascii_rules {
errors.push(Error::DissallowedMappedInStd3);
}
output.push_str(decode_slice(slice))
Expand Down Expand Up @@ -293,8 +293,8 @@ fn validate(label: &str, is_bidi_domain: bool, config: Config, errors: &mut Vec<
// V6: Check against Mapping Table
else if label.chars().any(|c| match *find_char(c) {
Mapping::Valid => false,
Mapping::Deviation(_) => config.flags.transitional_processing,
Mapping::DisallowedStd3Valid => config.flags.use_std3_ascii_rules,
Mapping::Deviation(_) => config.transitional_processing,
Mapping::DisallowedStd3Valid => config.use_std3_ascii_rules,
_ => true,
}) {
errors.push(Error::ValidityCriteria);
Expand All @@ -315,7 +315,7 @@ fn validate(label: &str, is_bidi_domain: bool, config: Config, errors: &mut Vec<
fn processing(domain: &str, config: Config, errors: &mut Vec<Error>) -> String {
let mut mapped = String::with_capacity(domain.len());
for c in domain.chars() {
map_char(c, config.flags, &mut mapped, errors)
map_char(c, config, &mut mapped, errors)
}
let mut normalized = String::with_capacity(mapped.len());
normalized.extend(mapped.nfc());
Expand Down Expand Up @@ -371,35 +371,30 @@ fn processing(domain: &str, config: Config, errors: &mut Vec<Error>) -> String {
validated
}

#[derive(Clone, Copy)]
#[derive(Clone, Copy, Default)]
pub struct Config {
flags: Flags,
use_std3_ascii_rules: bool,
transitional_processing: bool,
verify_dns_length: bool,
check_hyphens: bool,
}

impl From<Flags> for Config {
#[inline]
fn from(flags: Flags) -> Self {
Self { flags, check_hyphens: true }
}
}

impl Config {
#[inline]
pub fn use_std3_ascii_rules(mut self, value: bool) -> Self {
self.flags.use_std3_ascii_rules = value;
self.use_std3_ascii_rules = value;
self
}

#[inline]
pub fn transitional_processing(mut self, value: bool) -> Self {
self.flags.transitional_processing = value;
self.transitional_processing = value;
self
}

#[inline]
pub fn verify_dns_length(mut self, value: bool) -> Self {
self.flags.verify_dns_length = value;
self.verify_dns_length = value;
self
}

Expand Down Expand Up @@ -432,7 +427,7 @@ impl Config {
}
}

if self.flags.verify_dns_length {
if self.verify_dns_length {
let domain = if result.ends_with(".") { &result[..result.len()-1] } else { &*result };
if domain.len() < 1 || domain.split('.').any(|label| label.len() < 1) {
errors.push(Error::TooShortForDns)
Expand Down Expand Up @@ -462,13 +457,6 @@ impl Config {

}

#[derive(Copy, Clone)]
pub struct Flags {
pub use_std3_ascii_rules: bool,
pub transitional_processing: bool,
pub verify_dns_length: bool,
}

#[derive(PartialEq, Eq, Clone, Copy, Debug)]
enum Error {
PunycodeError,
Expand All @@ -486,16 +474,3 @@ enum Error {
/// More details may be exposed in the future.
#[derive(Debug)]
pub struct Errors(Vec<Error>);

/// http://www.unicode.org/reports/tr46/#ToASCII
pub fn to_ascii(domain: &str, flags: Flags) -> Result<String, Errors> {
Config::from(flags).to_ascii(domain)
}

/// http://www.unicode.org/reports/tr46/#ToUnicode
///
/// Only `use_std3_ascii_rules` is used in `flags`.
pub fn to_unicode(domain: &str, mut flags: Flags) -> (String, Result<(), Errors>) {
flags.transitional_processing = false;
Config::from(flags).to_unicode(domain)
}

0 comments on commit b2b70f5

Please sign in to comment.