Просмотр исходного кода

Maintain the invariant that an URL can not be both non-relative and special.

Simon Sapin 10 лет назад
Родитель
Сommit
450af0e482
2 измененных файлов с 7 добавлено и 6 удалено
  1. 5 4
      src/lib.rs
  2. 2 2
      src/parser.rs

+ 5 - 4
src/lib.rs

@@ -142,7 +142,7 @@ use std::str;
 pub use encoding::EncodingOverride;
 pub use origin::{Origin, OpaqueOrigin};
 pub use host::{Host, HostAndPort, SocketAddrs};
-pub use parser::{ParseError, to_u32};
+pub use parser::{ParseError, SchemeType, to_u32};
 pub use slicing::Position;
 pub use webidl::WebIdl;
 
@@ -479,7 +479,7 @@ impl Url {
             (None, None) => (to_u32(self.serialization.len()).unwrap(), String::new())
         };
         let non_relative = self.non_relative();
-        let scheme_type = parser::SchemeType::from(self.scheme());
+        let scheme_type = SchemeType::from(self.scheme());
         self.serialization.truncate(self.path_start as usize);
         self.mutate(|parser| {
             if non_relative {
@@ -547,7 +547,7 @@ impl Url {
             },
             (None, None) => String::new()
         };
-        let scheme_type = parser::SchemeType::from(self.scheme());
+        let scheme_type = SchemeType::from(self.scheme());
         let path_start = self.path_start as usize;
         self.serialization.push('/');
         self.mutate(|parser| {
@@ -797,7 +797,8 @@ impl Url {
                           -> Result<(), ()> {
         let mut parser = Parser::for_setter(String::new());
         let remaining = try!(parser.parse_scheme(scheme));
-        if !(remaining.is_empty() || allow_extra_input_after_colon) {
+        if (!remaining.is_empty() && !allow_extra_input_after_colon) ||
+                (!self.has_host() && SchemeType::from(&parser.serialization).is_special()) {
             return Err(())
         }
         let old_scheme_end = self.scheme_end;

+ 2 - 2
src/parser.rs

@@ -72,11 +72,11 @@ pub enum SchemeType {
 }
 
 impl SchemeType {
-    fn is_special(&self) -> bool {
+    pub fn is_special(&self) -> bool {
         !matches!(*self, SchemeType::NotSpecial)
     }
 
-    fn is_file(&self) -> bool {
+    pub fn is_file(&self) -> bool {
         matches!(*self, SchemeType::File)
     }