Skip to content

Commit d65fdce

Browse files
committed
Merge pull request #83 from valenting/master
Public urlutils and check type in set_scheme
2 parents 6a20f9b + 77f4bbd commit d65fdce

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

src/lib.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ use encoding::EncodingOverride;
147147
mod encoding;
148148
mod host;
149149
mod parser;
150-
mod urlutils;
150+
pub mod urlutils;
151151
pub mod percent_encoding;
152152
pub mod form_urlencoded;
153153
pub mod punycode;
@@ -434,14 +434,21 @@ pub enum SchemeType {
434434
FileLike,
435435
}
436436

437-
438437
impl SchemeType {
439438
pub fn default_port(&self) -> Option<u16> {
440439
match self {
441440
&SchemeType::Relative(default_port) => Some(default_port),
442441
_ => None,
443442
}
444443
}
444+
pub fn same_as(&self, other: SchemeType) -> bool {
445+
match (self, other) {
446+
(&SchemeType::NonRelative, SchemeType::NonRelative) => true,
447+
(&SchemeType::Relative(_), SchemeType::Relative(_)) => true,
448+
(&SchemeType::FileLike, SchemeType::FileLike) => true,
449+
_ => false
450+
}
451+
}
445452
}
446453

447454
/// http://url.spec.whatwg.org/#relative-scheme

src/urlutils.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,13 @@ use percent_encoding::{utf8_percent_encode_to, USERNAME_ENCODE_SET, PASSWORD_ENC
1616

1717

1818
#[allow(dead_code)]
19-
struct UrlUtilsWrapper<'a> {
20-
url: &'a mut Url,
21-
parser: &'a UrlParser<'a>,
19+
pub struct UrlUtilsWrapper<'a> {
20+
pub url: &'a mut Url,
21+
pub parser: &'a UrlParser<'a>,
2222
}
2323

24-
2524
#[doc(hidden)]
26-
trait UrlUtils {
25+
pub trait UrlUtils {
2726
fn set_scheme(&mut self, input: &str) -> ParseResult<()>;
2827
fn set_username(&mut self, input: &str) -> ParseResult<()>;
2928
fn set_password(&mut self, input: &str) -> ParseResult<()>;
@@ -40,6 +39,9 @@ impl<'a> UrlUtils for UrlUtilsWrapper<'a> {
4039
fn set_scheme(&mut self, input: &str) -> ParseResult<()> {
4140
match ::parser::parse_scheme(input, Context::Setter) {
4241
Some((scheme, _)) => {
42+
if self.parser.get_scheme_type(&self.url.scheme).same_as(self.parser.get_scheme_type(&scheme)) {
43+
return Err(ParseError::InvalidScheme);
44+
}
4345
self.url.scheme = scheme;
4446
Ok(())
4547
},

0 commit comments

Comments
 (0)