ソースを参照

Properly copy hosts of base file:// URLs when needed

> test result: FAILED. 642 passed; 71 failed; 0 ignored; 0 measured
Anthony Ramine 7 年 前
コミット
efe9ab9888
1 ファイル変更18 行追加10 行削除
  1. 18 10
      src/parser.rs

+ 18 - 10
src/parser.rs

@@ -538,36 +538,44 @@ impl<'a> Parser<'a> {
                     fragment_start: fragment_start,
                     fragment_start: fragment_start,
                 });
                 });
             } else {
             } else {
-                self.serialization.push_str("file:///");
+                self.serialization.push_str("file://");
                 let scheme_end = "file".len() as u32;
                 let scheme_end = "file".len() as u32;
-                let path_start = "file://".len();
+                let host_start = "file://".len();
+                let mut host_end = host_start;
+                let mut host = HostInternal::None;
                 if !starts_with_windows_drive_letter_segment(&input_after_first_char) {
                 if !starts_with_windows_drive_letter_segment(&input_after_first_char) {
                     if let Some(base_url) = base_file_url {
                     if let Some(base_url) = base_file_url {
                         let first_segment = base_url.path_segments().unwrap().next().unwrap();
                         let first_segment = base_url.path_segments().unwrap().next().unwrap();
                         if is_normalized_windows_drive_letter(first_segment) {
                         if is_normalized_windows_drive_letter(first_segment) {
-                            self.serialization.push_str(first_segment);
                             self.serialization.push('/');
                             self.serialization.push('/');
+                            self.serialization.push_str(first_segment);
+                        } else if let Some(host_str) = base_url.host_str() {
+                            self.serialization.push_str(host_str);
+                            host_end = self.serialization.len();
+                            host = base_url.host.clone();
                         }
                         }
                     }
                     }
                 }
                 }
+                self.serialization.push('/');
                 let remaining = self.parse_path(
                 let remaining = self.parse_path(
                     SchemeType::File,
                     SchemeType::File,
                     &mut false,
                     &mut false,
-                    path_start,
+                    host_end,
                     input_after_first_char,
                     input_after_first_char,
                 );
                 );
                 let (query_start, fragment_start) =
                 let (query_start, fragment_start) =
                     self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
                     self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
-                let path_start = path_start as u32;
+                let host_start = host_start as u32;
+                let host_end = host_end as u32;
                 return Ok(Url {
                 return Ok(Url {
                     serialization: self.serialization,
                     serialization: self.serialization,
                     scheme_end: scheme_end,
                     scheme_end: scheme_end,
-                    username_end: path_start,
-                    host_start: path_start,
-                    host_end: path_start,
-                    host: HostInternal::None,
+                    username_end: host_start,
+                    host_start,
+                    host_end,
+                    host,
                     port: None,
                     port: None,
-                    path_start: path_start,
+                    path_start: host_end,
                     query_start: query_start,
                     query_start: query_start,
                     fragment_start: fragment_start,
                     fragment_start: fragment_start,
                 });
                 });