Skip to content

Commit 9ac3f29

Browse files
committed
Properly copy hosts of base file:// URLs when needed
> test result: FAILED. 642 passed; 71 failed; 0 ignored; 0 measured
1 parent 3747f87 commit 9ac3f29

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ assert_eq!(css_url.as_str(), "http://servo.github.io/rust-url/main.css");
105105
# run().unwrap();
106106
*/
107107

108-
#![doc(html_root_url = "https://docs.rs/url/2.0.0")]
108+
// #![doc(html_root_url = "https://docs.rs/url/2.0.0")]
109109

110110
#[macro_use]
111111
extern crate matches;

src/parser.rs

+18-10
Original file line numberDiff line numberDiff line change
@@ -520,36 +520,44 @@ impl<'a> Parser<'a> {
520520
fragment_start: fragment_start,
521521
});
522522
} else {
523-
self.serialization.push_str("file:///");
523+
self.serialization.push_str("file://");
524524
let scheme_end = "file".len() as u32;
525-
let path_start = "file://".len();
525+
let host_start = "file://".len();
526+
let mut host_end = host_start;
527+
let mut host = HostInternal::None;
526528
if !starts_with_windows_drive_letter_segment(&input_after_first_char) {
527529
if let Some(base_url) = base_file_url {
528530
let first_segment = base_url.path_segments().unwrap().next().unwrap();
529531
if is_normalized_windows_drive_letter(first_segment) {
530-
self.serialization.push_str(first_segment);
531532
self.serialization.push('/');
533+
self.serialization.push_str(first_segment);
534+
} else if let Some(host_str) = base_url.host_str() {
535+
self.serialization.push_str(host_str);
536+
host_end = self.serialization.len();
537+
host = base_url.host.clone();
532538
}
533539
}
534540
}
541+
self.serialization.push('/');
535542
let remaining = self.parse_path(
536543
SchemeType::File,
537544
&mut false,
538-
path_start,
545+
host_end,
539546
input_after_first_char,
540547
);
541548
let (query_start, fragment_start) =
542549
self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
543-
let path_start = path_start as u32;
550+
let host_start = host_start as u32;
551+
let host_end = host_end as u32;
544552
return Ok(Url {
545553
serialization: self.serialization,
546554
scheme_end: scheme_end,
547-
username_end: path_start,
548-
host_start: path_start,
549-
host_end: path_start,
550-
host: HostInternal::None,
555+
username_end: host_start,
556+
host_start,
557+
host_end,
558+
host,
551559
port: None,
552-
path_start: path_start,
560+
path_start: host_end,
553561
query_start: query_start,
554562
fragment_start: fragment_start,
555563
});

0 commit comments

Comments
 (0)