tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.rg -n "BeforePath|AfterPort|path\(|serialize|non-special|special|cannot-be-a-base|authority|join|relative" url/src
Chunk ID: 704f06
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 4916
Output:
url/src/host.rs:15:use serde::{Deserialize, Serialize};
url/src/host.rs:19:#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
url/src/host.rs:40:#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
url/src/host.rs:45: /// a special URL, or percent encoded for non-special URLs. Hosts for
url/src/host.rs:46: /// non-special URLs are also called opaque hosts.
url/src/host.rs:223:// https://url.spec.whatwg.org/#concept-ipv6-serializer step 2 and 3
url/src/host.rs:250: // https://url.spec.whatwg.org/#concept-ipv6-serializer
url/src/slicing.rs:49:/// let authority: &str = &some_url[Position::BeforeUsername..Position::AfterPort];
url/src/slicing.rs:50:/// let data_url_payload: &str = &some_url[Position::BeforePath..Position::AfterQuery];
url/src/slicing.rs:51:/// let scheme_relative: &str = &some_url[Position::BeforeUsername..];
url/src/slicing.rs:91: AfterPort,
url/src/slicing.rs:92: BeforePath,
url/src/slicing.rs:109: if self.has_authority() {
url/src/slicing.rs:121: if self.has_authority() && self.byte_at(self.username_end) == b':' {
url/src/slicing.rs:130: if self.has_authority() && self.byte_at(self.username_end) == b':' {
url/src/slicing.rs:152: Position::AfterPort => self.path_start as usize,
url/src/slicing.rs:154: Position::BeforePath => self.path_start as usize,
url/src/origin.rs:18: let result = Url::parse(url.path());
url/src/quirks.rs:143: &url[Position::BeforeHost..Position::AfterPort]
url/src/quirks.rs:149: // If context object’s url’s cannot-be-a-base-URL flag is set, then return.
url/src/quirks.rs:216: // Empty host on special not file url
url/src/quirks.rs:238: &url[Position::BeforePort..Position::AfterPort]
url/src/quirks.rs:268: url.path()
url/src/quirks.rs:277: || (SchemeType::from(url.scheme()).is_special()
url/src/quirks.rs:278: // \ is a segment delimiter for 'special' URLs"
url/src/quirks.rs:281: url.set_path(new_pathname)
url/src/quirks.rs:285: url.set_path(&path_to_set)
url/src/lib.rs:42:assert!(issue_list_url.path() == "/rust-lang/rust/issues");
url/src/lib.rs:46:assert!(&issue_list_url[Position::BeforePath..] == "/rust-lang/rust/issues?labels=E-easy&state=open");
url/src/lib.rs:54:Some URLs are said to be *cannot-be-a-base*:
url/src/lib.rs:67:assert!(data_url.path() == "text/plain,Hello");
url/src/lib.rs:78:Enable the `serde` feature to include `Deserialize` and `Serialize` implementations for `url::Url`.
url/src/lib.rs:82:Many contexts allow URL *references* that can be relative to a *base URL*:
url/src/lib.rs:88:Since parsed URLs are absolute, giving a base is required for parsing relative URLs:
url/src/lib.rs:96:Use the `join` method on an `Url` to use it as a base URL:
url/src/lib.rs:104:let css_url = this_document.join("../main.css")?;
url/src/lib.rs:115:[`serde::Deserialize`](https://docs.rs/serde/1/serde/trait.Deserialize.html).
url/src/lib.rs:176: /// hierarchical = authority? hierarchical-path
url/src/lib.rs:177: /// authority = "//" userinfo? host [ ":" port ]?
url/src/lib.rs:326: fn strip_trailing_spaces_from_opaque_path(&mut self) {
url/src/lib.rs:353: /// The inverse of this is [`make_relative`].
url/src/lib.rs:367: /// let url = base.join("c.png")?;
url/src/lib.rs:371: /// let url = base.join("c.png")?;
url/src/lib.rs:384: /// [`make_relative`]: #method.make_relative
url/src/lib.rs:386: pub fn join(&self, input: &str) -> Result<Url, crate::ParseError> {
url/src/lib.rs:390: /// Creates a relative URL if possible, with this URL as the base URL.
url/src/lib.rs:392: /// This is the inverse of [`join`].
url/src/lib.rs:403: /// let relative = base.make_relative(&url);
url/src/lib.rs:404: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
url/src/lib.rs:408: /// let relative = base.make_relative(&url);
url/src/lib.rs:409: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
url/src/lib.rs:413: /// let relative = base.make_relative(&url);
url/src/lib.rs:414: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("../d/c.png"));
url/src/lib.rs:418: /// let relative = base.make_relative(&url);
url/src/lib.rs:419: /// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("?e=f"));
url/src/lib.rs:430: /// [`join`]: #method.join
url/src/lib.rs:431: pub fn make_relative(&self, url: &Url) -> Option<String> {
url/src/lib.rs:444: let mut relative = String::new();
url/src/lib.rs:457: let (base_path, base_filename) = extract_path_filename(self.path());
url/src/lib.rs:458: let (url_path, url_filename) = extract_path_filename(url.path());
url/src/lib.rs:476: if !relative.is_empty() {
url/src/lib.rs:477: relative.push('/');
url/src/lib.rs:480: relative.push_str("..");
url/src/lib.rs:485: if !relative.is_empty() {
url/src/lib.rs:486: relative.push('/');
url/src/lib.rs:489: relative.push_str(url_path_segment);
url/src/lib.rs:493: if !relative.is_empty() || base_filename != url_filename {
url/src/lib.rs:499: relative.push('/');
url/src/lib.rs:501: if !relative.is_empty() {
url/src/lib.rs:502: relative.push('/');
url/src/lib.rs:504: relative.push_str(url_filename);
url/src/lib.rs:510: relative.push('?');
url/src/lib.rs:511: relative.push_str(query);
url/src/lib.rs:515: relative.push('#');
url/src/lib.rs:516: relative.push_str(fragment);
url/src/lib.rs:519: Some(relative)
url/src/lib.rs:638: // URL with authority
url/src/lib.rs:660: if SchemeType::from(self.scheme()).is_special() {
url/src/lib.rs:680: // Anarchist URL (no authority)
url/src/lib.rs:815: /// Return whether the URL has an 'authority',
url/src/lib.rs:819: /// or cannot-be-a-base like `data:text/plain,Stuff`.
url/src/lib.rs:821: /// See also the `authority` method.
url/src/lib.rs:831: /// assert!(url.has_authority());
url/src/lib.rs:834: /// assert!(!url.has_authority());
url/src/lib.rs:837: /// assert!(!url.has_authority());
url/src/lib.rs:843: pub fn has_authority(&self) -> bool {
url/src/lib.rs:848: /// Return the authority of this URL as an ASCII string.
url/src/lib.rs:851: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:853: /// Ports are omitted if they match the well known port of a special URL.
url/src/lib.rs:857: /// See also the `has_authority` method.
url/src/lib.rs:867: /// assert_eq!(url.authority(), "");
url/src/lib.rs:869: /// assert_eq!(url.authority(), "");
url/src/lib.rs:871: /// assert_eq!(url.authority(), "user:password@example.com");
url/src/lib.rs:873: /// assert_eq!(url.authority(), "%C3%A0lex.%D1%80%D1%84.example.com:6667");
url/src/lib.rs:875: /// assert_eq!(url.authority(), "xn--lex-8ka.xn--p1ai.example.com");
url/src/lib.rs:880: pub fn authority(&self) -> &str {
url/src/lib.rs:882: if self.has_authority() && self.path_start > self.scheme_end + scheme_separator_len {
url/src/lib.rs:889: /// Return whether this URL is a cannot-be-a-base URL,
url/src/lib.rs:890: /// meaning that parsing a relative URL string with this URL as the base will return an error.
url/src/lib.rs:943: if self.has_authority() && self.username_end > self.scheme_end + scheme_separator_len {
url/src/lib.rs:977: if self.has_authority()
url/src/lib.rs:1016: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:1056: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:1096: /// of a special URL, or percent encoded for non-special URLs.
url/src/lib.rs:1241: /// For cannot-be-a-base URLs, this is an arbitrary string that doesn’t start with '/'.
url/src/lib.rs:1252: /// assert_eq!(url.path(), "/api/versions");
url/src/lib.rs:1255: /// assert_eq!(url.path(), "/");
url/src/lib.rs:1258: /// assert_eq!(url.path(), "/countries/vi%E1%BB%87t%20nam");
url/src/lib.rs:1263: pub fn path(&self) -> &str {
url/src/lib.rs:1272: /// Unless this URL is cannot-be-a-base,
url/src/lib.rs:1276: /// Return `None` for cannot-be-a-base URLs.
url/src/lib.rs:1311: let path = self.path();
url/src/lib.rs:1464: self.strip_trailing_spaces_from_opaque_path();
url/src/lib.rs:1529: self.strip_trailing_spaces_from_opaque_path();
url/src/lib.rs:1587: fn take_after_path(&mut self) -> String {
url/src/lib.rs:1608: /// url.set_path("api/comments");
url/src/lib.rs:1610: /// assert_eq!(url.path(), "/api/comments");
url/src/lib.rs:1613: /// url.set_path("data/report.csv");
url/src/lib.rs:1615: /// assert_eq!(url.path(), "/data/report.csv");
url/src/lib.rs:1619: /// url.set_path("api/some comments");
url/src/lib.rs:1621: /// assert_eq!(url.path(), "/api/some%20comments");
url/src/lib.rs:1625: /// url.set_path("api/some%20comments");
url/src/lib.rs:1627: /// assert_eq!(url.path(), "/api/some%20comments");
url/src/lib.rs:1633: pub fn set_path(&mut self, mut path: &str) {
url/src/lib.rs:1634: let after_path = self.take_after_path();
url/src/lib.rs:1645: parser.parse_cannot_be_a_base_path(parser::Input::new(path));
url/src/lib.rs:1651: self.restore_after_path(old_after_path_pos, &after_path);
url/src/lib.rs:1656: /// Return `Err(())` if this URL is cannot-be-a-base.
url/src/lib.rs:1666: fn restore_after_path(&mut self, old_after_path_position: u32, after_path: &str) {
url/src/lib.rs:1685: /// If this URL is cannot-be-a-base, does not have a host, or has the `file` scheme;
url/src/lib.rs:1723: /// Cannot set port for cannot-be-a-base URLs:
url/src/lib.rs:1832: /// Cannot remove host for 'special' schemes (e.g. `http`):
url/src/lib.rs:1848: /// Cannot change or remove host for cannot-be-a-base URLs:
url/src/lib.rs:1871: /// If this URL is cannot-be-a-base or there is an error parsing the given `host`,
url/src/lib.rs:1883: if host.is_empty() && scheme_type.is_special() && !scheme_type.is_file() {
url/src/lib.rs:1901: if SchemeType::from(self.scheme()).is_special() {
url/src/lib.rs:1907: if scheme_type.is_special() && !scheme_type.is_file() {
url/src/lib.rs:1948: if !self.has_authority() {
url/src/lib.rs:1984: /// If this URL is cannot-be-a-base, do nothing and return `Err`.
url/src/lib.rs:2035: /// If this URL is cannot-be-a-base or does not have a host, do nothing and return `Err`.
url/src/lib.rs:2119: /// If this URL is cannot-be-a-base or does not have a host, do nothing and return `Err`.
url/src/lib.rs:2209: /// * If this URL is cannot-be-a-base and the new scheme is one of
url/src/lib.rs:2269: /// Cannot change URL’s scheme from `mailto` (cannot-be-a-base) to `https`:
url/src/lib.rs:2320: // If url’s scheme is a special scheme and buffer is not a special scheme, then return.
url/src/lib.rs:2321: if (new_scheme_type.is_special() && !old_scheme_type.is_special()) ||
url/src/lib.rs:2322: // If url’s scheme is not a special scheme and buffer is a special scheme, then return.
url/src/lib.rs:2323: (!new_scheme_type.is_special() && old_scheme_type.is_special()) ||
url/src/lib.rs:2326: (new_scheme_type.is_file() && self.has_authority())
url/src/lib.rs:2331: if !remaining.is_empty() || (!self.has_host() && new_scheme_type.is_special()) {
url/src/lib.rs:2380: /// let url = Url::from_file_path("/tmp/foo.txt")?;
url/src/lib.rs:2383: /// let url = Url::from_file_path("../foo.txt");
url/src/lib.rs:2386: /// let url = Url::from_file_path("https://google.com/");
url/src/lib.rs:2423: /// * `"index.html"` parsed with `Url::from_directory_path(Path::new("/var/www"))`
url/src/lib.rs:2425: /// * `"index.html"` parsed with `Url::from_file_path(Path::new("/var/www"))`
url/src/lib.rs:2433: let mut url = Url::from_file_path(path)?;
url/src/lib.rs:2442: /// The corresponding `deserialize_internal` method sacrifices some invariant-checking
url/src/lib.rs:2443: /// for speed, compared to the `Deserialize` trait impl.
url/src/lib.rs:2448: pub fn serialize_internal<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
url/src/lib.rs:2479: .serialize(serializer)
url/src/lib.rs:2484: /// The corresponding `deserialize_internal` method sacrifices some invariant-checking
url/src/lib.rs:2485: /// for speed, compared to the `Deserialize` trait impl.
url/src/lib.rs:2490: pub fn deserialize_internal<'de, D>(deserializer: D) -> Result<Self, D::Error>
url/src/lib.rs:2492: D: serde::Deserializer<'de>,
url/src/lib.rs:2494: use serde::de::{Deserialize, Error, Unexpected};
url/src/lib.rs:2506: ) = Deserialize::deserialize(deserializer)?;
url/src/lib.rs:2538: /// let path = url.to_file_path();
url/src/lib.rs:2549: pub fn to_file_path(&self) -> Result<PathBuf, ()> {
url/src/lib.rs:2625: .field("path", &self.path())
url/src/lib.rs:2708: fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
url/src/lib.rs:2712: serializer.serialize_str(self.as_str())
url/src/lib.rs:2716:/// Deserializes this URL from a `serde` stream.
url/src/lib.rs:2720:impl<'de> serde::Deserialize<'de> for Url {
url/src/lib.rs:2721: fn deserialize<D>(deserializer: D) -> Result<Url, D::Error>
url/src/lib.rs:2723: D: serde::Deserializer<'de>,
url/src/lib.rs:2747: deserializer.deserialize_str(UrlVisitor)
url/src/lib.rs:2892: "to_file_path() failed to produce an absolute Path"
url/src/lib.rs:2954: "to_file_path() failed to produce an absolute Path"
url/src/path_segments.rs:46: let after_path = url.take_after_path();
url/src/path_segments.rs:49: if SchemeType::from(url.scheme()).is_special() {
url/src/path_segments.rs:68: .restore_after_path(self.old_after_path_position, &self.after_path)
url/src/path_segments.rs:73: /// Remove all segments in the path, leaving the minimal `url.path() == "/"`.
url/src/path_segments.rs:101: /// unless it is also the initial slash (so this does nothing if `url.path() == "/")`.
url/src/path_segments.rs:137: /// If the path only has one segment, make it empty such that `url.path() == "/"`.
url/src/path_segments.rs:164: /// Each segment is percent-encoded like in `Url::parse` or `Url::join`,
url/src/path_segments.rs:176: /// To obtain a behavior similar to `Url::join`, call `.pop()` unconditionally first.
url/src/path_segments.rs:230: // Non special url's path might still be empty
url/src/path_segments.rs:236: parser.parse_path(
url/src/parser.rs:39:// The backslash (\) character is treated as a path separator in special URLs
url/src/parser.rs:84: RelativeUrlWithoutBase => "relative URL without a base",
url/src/parser.rs:85: RelativeUrlWithCannotBeABaseBase => "relative URL with a cannot-be-a-base base",
url/src/parser.rs:86: SetHostOnCannotBeABaseUrl => "a cannot-be-a-base URL doesn’t have a host to set",
url/src/parser.rs:153: pub fn is_special(&self) -> bool {
url/src/parser.rs:379: self.parse_relative(input, scheme_type, base_url)
url/src/parser.rs:432: // special relative or authority state
url/src/parser.rs:438: // "Cannot-be-a-base" URLs only happen with "not special" schemes.
url/src/parser.rs:441: return self.parse_relative(input, scheme_type, base_url);
url/src/parser.rs:444: // special authority slashes state
url/src/parser.rs:454: SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end),
url/src/parser.rs:459: fn parse_non_special(
url/src/parser.rs:465: // path or authority state (
url/src/parser.rs:469: // Anarchist URL (no authority)
url/src/parser.rs:479: self.parse_path(scheme_type, &mut false, path_start, input)
url/src/parser.rs:481: self.parse_cannot_be_a_base_path(input)
url/src/parser.rs:525: self.parse_path(SchemeType::File, &mut has_host, path_start, remaining)
url/src/parser.rs:581: self.parse_path(SchemeType::File, &mut false, host_end, parse_path_input);
url/src/parser.rs:642: self.shorten_path(SchemeType::File, base_url.path_start as usize);
url/src/parser.rs:643: let remaining = self.parse_path(
url/src/parser.rs:665: self.parse_path(SchemeType::File, &mut false, path_start, input);
url/src/parser.rs:688: let remaining = self.parse_path(SchemeType::File, &mut false, path_start, input);
url/src/parser.rs:707: fn parse_relative(
url/src/parser.rs:713: // relative state
url/src/parser.rs:769: let remaining = self.parse_path(
url/src/parser.rs:794: self.pop_path(scheme_type, base_url.path_start as usize);
url/src/parser.rs:795: // A special url always has a path.
url/src/parser.rs:798: && (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
url/src/parser.rs:803: (Some('/'), remaining) => self.parse_path(
url/src/parser.rs:810: self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
url/src/parser.rs:836: // authority state
url/src/parser.rs:837: let before_authority = self.serialization.len();
url/src/parser.rs:839: let has_authority = before_authority != self.serialization.len();
url/src/parser.rs:844: if host == HostInternal::None && has_authority {
url/src/parser.rs:883: '\\' if scheme_type.is_special() => break,
url/src/parser.rs:893: // url is special and c is U+005C (\)
url/src/parser.rs:896: if c == '/' || c == '?' || c == '#' || (scheme_type.is_special() && c == '\\') {
url/src/parser.rs:953: if scheme_type.is_special() {
url/src/parser.rs:988: '\\' if scheme_type.is_special() => break,
url/src/parser.rs:1020: if !scheme_type.is_special() {
url/src/parser.rs:1135: // If url is special, then:
url/src/parser.rs:1136: if scheme_type.is_special() {
url/src/parser.rs:1141: // A special URL always has a non-empty path.
url/src/parser.rs:1146: return self.parse_path(scheme_type, has_host, path_start, remaining);
url/src/parser.rs:1149: return self.parse_path(scheme_type, has_host, path_start, input);
url/src/parser.rs:1163: self.parse_path(scheme_type, has_host, path_start, input)
url/src/parser.rs:1191: && scheme_type.is_special() =>
url/src/parser.rs:1205: if scheme_type.is_special() {
url/src/parser.rs:1234: self.shorten_path(scheme_type, path_start);
url/src/parser.rs:1236: // and then if neither c is U+002F (/), nor url is special and c is U+005C (\), append the empty string to url’s path.
url/src/parser.rs:1242: // nor url is special and c is U+005C (\), append the empty string to url’s path.
url/src/parser.rs:1300: fn shorten_path(&mut self, scheme_type: SchemeType, path_start: usize) {
url/src/parser.rs:1312: self.pop_path(scheme_type, path_start);
url/src/parser.rs:1316: fn pop_path(&mut self, scheme_type: SchemeType, path_start: usize) {
url/src/parser.rs:1434: let set = if scheme_type.is_special() {
rg --files
Chunk ID: b649fb Wall time: 0.0001 seconds Process exited with code 0 Original token count: 21294 Output: Total output lines: 879 UPGRADING.md idna/Cargo.toml idna/src/make_uts46_mapping_table.py idna/src/uts46.rs idna/src/IdnaMappingTable.txt idna/src/lib.rs idna/src/punycode.rs idna/src/uts46_mapping_table.rs idna/tests/IdnaTestV2.txt idna/tests/uts46.rs idna/tests/punycode_tests.json idna/tests/tests.rs idna/tests/unit.rs idna/tests/punycode.rs idna/benches/all.rs LICENSE-APACHE data-url/Cargo.toml data-url/src/forgiving_base64.rs data-url/src/mime.rs data-url/src/lib.rs data-url/src/make_base64_decode_table.py data-url/tests/data-urls.json data-url/tests/generated-mime-types.json data-url/tests/base64.json data-url/tests/mime-types.json data-url/tests/wpt.rs data-url/README.md debug_metadata/url.natvis debug_metadata/README.md url/Cargo.toml url/src/host.rs url/src/slicing.rs url/src/origin.rs url/src/quirks.rs url/src/lib.rs url/src/path_segments.rs url/src/parser.rs url/tests/data.rs url/tests/setters_tests.json url/tests/urltestdata.json url/tests/unit.rs url/tests/debugger_visualizer.rs url/benches/parse_url.rs url/fuzz/Cargo.toml url/fuzz/fuzz_targets/parse.rs deny.toml LICENSE-MIT form_urlencoded/LICENSE-APACHE form_urlencoded/LICENSE-MIT form_urlencoded/Cargo.toml form_urlencoded/src/lib.rs SECURITY.md Cargo.lock percent_encoding/Cargo.toml percent_encoding/src/lib.rs Cargo.toml README.md target/debug/libpercent_encoding.rlib target/debug/liburl.rlib target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm.lock target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/8gogjfidpjzej9k6cuay2faf8.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/7ut7t8re1b826btusc5cl4v2x.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/agj3f7qghevfxfr23sr28wexi.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/a15dh6016y9308jgv5e47riq3.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1kxqi2cpw1wo5d2dnndxvf6q3.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/e4mnmm3s16tqamgbh0pqntiok.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/91l4rjlvxicdixq97uw7o70v7.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/02xsfoa6kzjvu1nw0xxho3nlc.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/czcyo95aiasa68gs2u0oxokxg.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/biwxx8v5me9yij2twxhq1ogap.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bykpo9u62mbxeguwentguhvb0.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3aei1d9abwc04gi9rd1cvlj2z.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/46oe1q2uzd5akxevv3r99fzip.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3t3b1o26rvpnv84xk4nmojy1e.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/deq16zjekzu8qul67ogjv8y31.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9q2hld4yimftwjnk562e1bqew.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2s6f3kdxqpgxfxyn1rc4xddur.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/dep-graph.bin target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2775hsj8wkvgpksif3rqwm63w.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9tkdo65ae4h7m9v8v0ats5of2.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/agq6p4fnfvqm77rbelsw0i4j6.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/work-products.bin target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/5v2gape4c61vc1ddu1kmo158v.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/28zb8h3ry0uxso7421eb3nt2k.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/epqw3gouk3odnxiuj1jo6hldl.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bowd06t3jgepd1eidi3j9o54c.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/eekib1ye0fmfgef6oigd601yv.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9whyp654sppd8k0rv4m5xmp82.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/01n2rtdvib90e2jsthfw51efv.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/900gb2yw76l4nrjafed0vh42m.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/a4enno5fp9euzckooxod3npn4.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/eczojs28z19hh99k6eb0g5j04.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3soable5b906do9pka3x2j9ur.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9g6iwsh5jtq52d8cdlz8yh4d1.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3k910szc0dn0ty4qgva8y2qq8.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/4shhir26nlxxq5pss0w47by52.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/258jnbd9zwu7ew57q7u0253aq.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/cnhr8x0pnp7ugoh3ko1u8qs45.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/ee5cxl6a6evr6lsdy0cpxedow.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3sebt2r12dsn1uk781qs3rnhj.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bvlmdykgj4xwvt127xupf70rc.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9phsq551fyex9j1tmbwzj74vr.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/502vo5unbup48b7ifgx6kehad.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/8rohcv8v1088qjcgbuymfy91d.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/0jbs3vebrmgnlpwe60ls7p9uz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9b7c6cf9hhtirf46fm6ecyjza.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/amkb38yht8dmwu1xgq03mti1h.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/de3ip26i8gt65m5od9658kn7r.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2at9epbxsgpyahlfumu7gjq9i.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/899ugj7od0x8px3v3ujykw1p6.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/83ku5vaflgndgid98zhn9tawa.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/5ajzztpqhrapukd0uwkqipsna.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1fn1lz061zk82vsndz5wj90o3.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2qgczw6toiaw1fowj9gsqadxt.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1mqw1yppynw397arbfl65hnkc.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/1ngss9k430ri6t12wx4v9zvcv.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/c7q5qfhogfqcw1j47ilyzo29x.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/csq4p3al5mzznuslat36pej80.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/a801ynq5m11ijqsdjkejvnu0s.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/98ekh76ol0t5gco2kc98r1jcy.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bva2kc5y142ksiw58kco1di5h.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/cdzafb4i2ma0gvcjzdxxuifs2.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6dty9q33gde7ehdujwsipdfj4.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/84sswellw3rrji8t4na9w2sdz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/bgdylkdpa0do687xtaeak4iyx.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/dadh94qizpyp8wrvsgtcggzlp.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/query-cache.bin target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3e03aiigsd27mupc64rh449kt.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/d4la7jajgpuc26d6ovpq23u1i.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/2ngb3hc1z6qtb06dq5cf3b3gd.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/4meummhxone2t5amg7j24wr07.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3en08tqxbksbxhaswgqi0sx28.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/9jih05jud875hiz8en3na0y9j.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/dw4jde1xo1n0w2xa4jntnkut0.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/99lgqd3gkfdf8sehcdf25lcgr.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6thfx2yz1zd3kkquq26m5mo9s.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/86qduwl8ldk65mozdb3lwi113.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3clpzgo1jabo9s68qdd232jqb.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/4wxyd8q63l2nsrutm7rkca580.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/77wc4bkdzcxbswmtmuaeya94v.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6m027519o46e4nno9lrqokkpz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/7gyyqs9cor3i9yfyf4poizv7a.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/3r59joa5o2hnz85fgblg17ylz.o target/debug/incremental/unit-1rtx6ttyceut6/s-hjou0rzxf7-0gprirm-8mmu68kplntmgv5jkthjsnd6n/6adv5em2rxewf6n5fqd8d7m9d.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/dep-graph.bin target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/3sfk52cnzdq3lqldqdla1qavt.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/work-products.bin target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/8ilh8nwuzeqny6ljn8jbw2i8k.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/4l1vm0j7jhztplafysuoeo49c.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/5fd3u3mwmlmcw5h6ml7cnji74.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/cz3povjitv5meffkbljpcs39v.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/query-cache.bin target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r-0i4hmo3dzf6r3t8anyfcx7eg7/7nwf44ir5vg1i4bia652z894r.o target/debug/incremental/url-3624ita5ju63y/s-hjou0ruvk4-1a7xc8r.lock target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/7cf9q8hxgewy7fxi1c17o9i05.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/9phx5yraspeaqwxoti1fgnsrn.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/04o9cgx8g2kz956ty9tpsgryb.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/5xo60wnqxg5d0zouu0oozzgbk.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/cb9bhzmp64hcwz0i5a2gb7ljo.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/4jj7m0xmf338g0h9ddeavq5tx.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/dep-graph.bin target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/5xerj1fbrybp04odmprzc2tli.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/work-products.bin target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/29coxn26xu0ucq3jceu8oc66m.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/92bdiyw3s2e5mvu7lwkgu6ivr.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/6s6poscwjxwdt5eyd6ym2r70v.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/7sk2a8sic80511hlwuz5hm29c.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/crxgtrgwuh1dtj2ptf8anhy4f.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/clrbht8a7rpj3ovzul6pwl080.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/4zoqbyoi6510ruh1s7ytygswe.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/3ym2vudmm4uwsebtisb6w517c.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/d4bdaewn9b8y4h2bd93722p17.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/afl8quyys9iwv7z3pvotj3q3e.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/emfetx9zqbl9xkryzrm9rd6dy.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/andomrbsvoso3335e5zhcj1yd.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/2n5wgpdggu3o4ey2pwhf1oujx.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/4mu0gd8b6clv6meqa7tzsdrcm.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/cpax00wsrg6ufv6h0tjjsk9ye.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/query-cache.bin target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/8gp07z2d6oe9s1xrjunbtmxij.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/7fu1fneukssvukuu62i6rlgw7.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/by2di4qiusbvp2t42y12c5clj.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/1s91xfp48o921nrv7o90ulx77.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/cqgmz89vl46h02iy47mi6p6c8.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/1lu2c6mxvsput39c4shrvgd2t.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/a887fs7l9anok7yw5qm1tt9wu.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/afn5x3bhw0mdk58dr58txotre.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/9ejwdbt8hw620lzueki5mdy2r.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417-dxiy9q2gpkp9di0h18y73gfd7/878cwrgtzo3vcpcqv4kutl8x3.o target/debug/incremental/unit-31a5kslhf18xu/s-hjou0rfi84-1h7v417.lock target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/9othkraw3qbdb5e9ev5eg5rtq.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/cwa0bj1vggn6xjpkf9nhbt9nt.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/cyujqk6vivgcm8twqp2o31aet.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/24pnjujsglbnpa144imdgykot.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/7twjxl7vvtzau3v8q21uk6x9u.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/5x0z02og4td8p1q4ek7ionbpk.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/cvjal1ffqe3tvi7ugt2tr7s24.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/dep-graph.bin target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/2le4kr196w91zykrbz1u38ldy.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/1zkurdy0ajj5ckboo5dkzjdp5.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/work-products.bin target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/27tkn0dgl56qtoxj7edcfivqp.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/e1at3tiumu08k4o2rzvebe97t.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/3nibda4ow4wvc5gijmqhxw72y.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/9vuil794wxxxynqcxqujejul8.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/0u7qi5ddthljzjcpkfc6ta8tr.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/f18ebq8c8rpbwvkctv3cv57sk.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/ai50witipr45wh5lk17f12bdv.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/6dio3aosr8nplwcwufgppoyhd.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/87igb8wed1g5rk6i2ov4tpsrx.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/5dborrn4nvyw8a2bcp2hs7ixt.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/4n2lprkjg52owqvtd3cs0bm1h.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/query-cache.bin target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/budy2lspdszs5dw7y7iww3mg2.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/el8785gtcnf25tu6awe8kr1wy.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/7wkr8rbqzz5uqwno7nh6bql9j.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/eoqjw13y8h2cc0l8sptxpkgou.o target/debug/incremental/idna-2s4mps90pq4mr/s-hjou0rrsg9-0nrlnq3-0ng4nc93r1nsvdzi5bfrz1y8b/9dvyata0eq51m9lrvm2pikibw.o target/debug/incremental…11294 tokens truncated…u1/egha0hz6c95suwbtpy10bgzi5.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/7p739lxaew3rm6w0vgd9cghu6.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/8pqvrox0kxsj8livgc85c1wg9.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/4ts9s7ewj6hs1mq0wceyckj9f.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/86ekl64ljgriz1xty557eim2h.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/3ctwdlikh71n6j7y9hnpp7i40.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/8qvjw65sfczifk0z4qq1mnfsj.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/query-cache.bin target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/51vfue1hjdjr7o96624o848qh.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/bu32tkdq4dttxi87c4o7fpm9q.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/d6gdt56vgtpwmkqfasmcnl48y.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/cstmfvi5yxnuel06fmtc9r60c.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/dkug62tycjyuwzgs6p260q5i9.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/f27hlljn4o4by4w1d2c3s4tla.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/3tfioxf6o0zfgi3fu6rj1qjqd.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/5z81ap6fkei2j8k4ajp4uh391.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/0rb2siaqtxtqsxe4xnwkv9ud9.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/1dhwbiwuhzrty7ss5lbmezekt.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/3nv95jgd7ldpzicily9exjqzb.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/3w9oxnf1edla6b11tvg2dt3v9.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a-bene5tmkrt5kv2rve6pdxzku1/69apbhc5hjzeydi5782yuhtq5.o target/debug/incremental/url-3cvdemg46jae7/s-hjou0p4irm-1yhu75a.lock target/debug/build/libc-ad25a1021d8bc503/build_script_build-ad25a1021d8bc503 target/debug/build/libc-ad25a1021d8bc503/build_script_build-ad25a1021d8bc503.d target/debug/build/libc-ad25a1021d8bc503/build-script-build target/debug/build/serde_core-58ec2e75b87c45d5/build_script_build-58ec2e75b87c45d5.d target/debug/build/serde_core-58ec2e75b87c45d5/build-script-build target/debug/build/serde_core-58ec2e75b87c45d5/build_script_build-58ec2e75b87c45d5 target/debug/build/proc-macro2-4ccecbdd481395e7/build_script_build-4ccecbdd481395e7 target/debug/build/proc-macro2-4ccecbdd481395e7/build_script_build-4ccecbdd481395e7.d target/debug/build/proc-macro2-4ccecbdd481395e7/build-script-build target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/7rh446oh9a9qssh1logdl02pd.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/138ywypj0p4hz8c1yzolci8vj.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/8zcz28ufrusxeuzvwrdddqw95.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/4ro337pndi6u8mq3ltkktfamc.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/8r7p6sjrebefmkpstumvn9f7c.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/dep-graph.bin target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/work-products.bin target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/6fd027e4vtb04drzfi3ibc3cy.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/9zrwc851ymvmtfsq2pqpib5uy.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/bkmjsi5y68po5wbn75lpdhupf.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/3985rk03xctcqi5zfib0q9rnq.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/2jum5x7384buq6qoewylcmnds.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/cfln0n5p7ztgntbkcvendyk68.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/cu8ohjtyqfg4mpuwwablueq9e.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/b8khd8v0l61h0tq6h9zykui3a.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/8mep6kq5b8mcakrzy46dileo0.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/3mzt170e2rc0li0bwa4r9dj39.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/query-cache.bin target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/cg8azhw7rv32mkhqq5vbcfg10.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/5lvxv7pmg6atq9ow2okbkke2u.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/5kfjkyy2cf9zqe2ecom52onda.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/73qx2yp1rq54gjsos0laejcub.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/4so737lo0vx00jofsz4ghxjgf.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw-97rveeplqley3535djdbtq0vi/729s4twcw4dvbcpmoh0mrwh8p.o target/debug/incremental/form_urlencoded-00uc8m5pkihl0/s-hjou0ovehp-0w1bekw.lock target/debug/build/syn-543e65d50dac7c38/output target/debug/build/syn-543e65d50dac7c38/invoked.timestamp target/debug/build/syn-543e65d50dac7c38/stderr target/debug/build/syn-543e65d50dac7c38/root-output target/debug/build/proc-macro2-bd986aab9ef403a2/output target/debug/build/proc-macro2-bd986aab9ef403a2/invoked.timestamp target/debug/build/proc-macro2-bd986aab9ef403a2/stderr target/debug/build/proc-macro2-bd986aab9ef403a2/root-output target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/16mrank5umtrmyio1o8ggdohc.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0eov6xcb3cxkoj0dza0c7zrov.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0q26nsy2hw75urq8j8u8de1m1.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9ylcjemhp24uxct0om6k3zdeh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/efmedkxy2by267imkj7eaj13a.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0jrzhm8a1370szlz2niqk6ua4.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/5idn9lrht456fghs23jt0uu25.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0cty7j0dg6ueh80u4wpa9s2o1.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4wojuyhe9v2sugp74y1hjmj9w.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6809ygbq2787l3g4totpw3886.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7g6eozzvf9uf86hmr1p3t6ymh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7egkk04k0cwqbmpk14n54zkbd.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/1w9ggip3r5yvw1ib0lszj7q5q.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/cpd3lf7bfub5o2zpcnj8ms62f.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/83n5zanjqh7u7cdpbpfbylw5d.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bskett978cnufg3oa1dkn384t.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dhqgdrxu1wyggalthhbq5ea55.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dus9hxw1qovzexfbulw8gsgjk.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/b1esjaqdlxbgf2ygwawyaeuaa.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/elz60d1tgq5mxnhd26z7n3si1.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bqq6dziwi1j5l7dvvqmxqkd1z.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/eh2dcw1tp8oje3nwi5vwb5lad.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6oogwtkt0i6bmq9u9gplsyaeg.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/42dvma5wqliejr82eyzb2q69w.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dep-graph.bin target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/374vie5vh0duu1ajn3rnnkfib.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4jf22m847t81rab5bz84pe5df.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/2dfl0gnco0sc40368c7e20r0r.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/47vol74196wo0j6tquo28jkqh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/2azj6kiibt5eyokraia0d07q5.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/d14l2ixyjpvk6wdbgvlpimc7n.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/445ncjwk0z08t6g0tbhl29h8m.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/work-products.bin target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/5f1ombqj49vnoomh36cayufa6.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/b2lipmztvegkf1teunq2uj0ao.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4kdv0bvdwq9gw0f1iw2ex3xhl.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/cyjbtppw3jh4zq1y83dacp1ja.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8cna0rkcfwkxilm86rds2066t.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9akcqwg56im4wy0pi3t06r9sv.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6ugab35o9yqleyreat18b6666.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/ew4nas5lp3gxypvmxmldvbfqu.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/1eyk6frfkd66zloqnqp8fni92.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/e9iwac2wb9smqkg5uwiw6g4yg.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4pz8qrtlta9z2a597pdwjii9g.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8sb7n6m3oyk8gfawcp6da5kpf.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bh8twggzos86tmwav6u8g66r6.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/23icqbbqtb6fh1vg0j2nucrdl.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/49874fpap0bz9ev8wt0oh3jst.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bcoxddjebok2dxnd5sqmj9vf0.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/64c3wkk340p79p1poyski6azn.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4noqoa6vh5sk0tt8xgqqbvsm5.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7u1ap92hc0rjbzokmg35g66f8.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9r7z0js5b605u71e9osf253jy.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9o0wf07ejkokkolxhhqyse963.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/acm5nyx4m5n7dq7ohx5zvt4aw.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4lr2ldlx67yk15v8x340dgu90.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/40gd9wpt86fycn4fgyvix592l.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/61ise8tyush68jvuafwxg7tc2.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/9fzopt7i74e3d2hvsv9ayiu67.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/33ewk0x0fixd108ujewwes8xm.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6bw77pie55u142ljxsob6dp7d.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/17ipzdtk2bfoc2hihkjlfagtn.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0uqiempuze711xd3n7g6qowld.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8y44fbxqsl3hw52ir2jgauam9.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/df1d1d6crlbw7skdgc3ra10mk.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/a93155414jj8u3eea9nlhbjz7.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/5u6j1gxxe61aliwm527klnujn.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/1ycfj2jkxq2cv1jkk554tvlih.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8o05of94ry9hcqubi0igstt4o.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bmb7llbmjd5v81iwnszfbvq4o.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/3me9m97na6kimdm6mlhkhr9d4.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4whcma8tc866ma6ncilkczxbc.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/duwjxu5aefho4hz3di6w04uwh.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/query-cache.bin target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/docrj24u4cc71i69idv1gwvg2.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/53m6w1lqbwsu0ti7wzsh9j0wx.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8efl2q7pm8bc1qe4le1o61j7f.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/7db4aa24j8eocrz5lyrfj0nrw.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/d6uyc7se8s4xqmsosofikoug0.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/bx4juq239lz1f2o9qd9boce6a.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/8m003xfbyn8who1bk030hdjj0.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/0otxrwmc96bn4uvt0dwss9f5z.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/06m80elx0jwoqg06t0fuif9m8.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/dtyuzookd6p0q32oh0d9easrb.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/6dl4gd0nauy0h0fluun719tyy.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8-4lvrqk2ogf09c5qvlidvae53n/4v4x7nrekfjjhm0e5355r9on3.o target/debug/incremental/idna-3i1sdojlmq5rx/s-hjou0p06fa-1bn0oh8.lock target/debug/build/anyhow-865c62892f774c58/build_script_build-865c62892f774c58.d target/debug/build/anyhow-865c62892f774c58/build_script_build-865c62892f774c58 target/debug/build/anyhow-865c62892f774c58/build-script-build target/debug/build/syn-255ecb636db8ec71/build_script_build-255ecb636db8ec71 target/debug/build/syn-255ecb636db8ec71/build-script-build target/debug/build/syn-255ecb636db8ec71/build_script_build-255ecb636db8ec71.d target/debug/build/libc-6f42403205f9303e/output target/debug/build/libc-6f42403205f9303e/invoked.timestamp target/debug/build/libc-6f42403205f9303e/stderr target/debug/build/libc-6f42403205f9303e/root-output target/debug/build/serde_json-0ccae1069ea496b1/build_script_build-0ccae1069ea496b1.d target/debug/build/serde_json-0ccae1069ea496b1/build_script_build-0ccae1069ea496b1 target/debug/build/serde_json-0ccae1069ea496b1/build-script-build target/debug/build/serde_json-56a19a2a331ed41b/output target/debug/build/serde_core-e64bb9c45bfe80f3/out/private.rs target/debug/build/serde_json-56a19a2a331ed41b/invoked.timestamp target/debug/build/serde_json-56a19a2a331ed41b/stderr target/debug/build/serde_json-56a19a2a331ed41b/root-output target/debug/build/serde_core-e64bb9c45bfe80f3/output target/debug/build/serde_core-e64bb9c45bfe80f3/invoked.timestamp target/debug/build/serde_core-e64bb9c45bfe80f3/stderr target/debug/build/serde_core-e64bb9c45bfe80f3/root-output target/debug/build/zmij-f4c55d12a4111926/output target/debug/build/zmij-f4c55d12a4111926/invoked.timestamp target/debug/build/zmij-f4c55d12a4111926/stderr target/debug/build/zmij-f4c55d12a4111926/root-output target/debug/build/serde-ef19f8e495c8dd30/out/private.rs target/debug/build/serde-ef19f8e495c8dd30/output target/debug/build/serde-ef19f8e495c8dd30/invoked.timestamp target/debug/build/serde-ef19f8e495c8dd30/stderr target/debug/build/serde-ef19f8e495c8dd30/root-output target/debug/build/serde-b1128fd7a9b46781/build_script_build-b1128fd7a9b46781 target/debug/build/serde-b1128fd7a9b46781/build-script-build target/debug/build/serde-b1128fd7a9b46781/build_script_build-b1128fd7a9b46781.d target/debug/build/anyhow-7ef9f9965b442394/output target/debug/build/quote-5b51a8dd8290005e/build_script_build-5b51a8dd8290005e target/debug/build/anyhow-7ef9f9965b442394/invoked.timestamp target/debug/build/quote-5b51a8dd8290005e/build_script_build-5b51a8dd8290005e.d target/debug/build/quote-5b51a8dd8290005e/build-script-build target/debug/build/anyhow-7ef9f9965b442394/stderr target/debug/build/anyhow-7ef9f9965b442394/root-output target/debug/build/zmij-66703644318e2170/build_script_build-66703644318e2170 target/debug/build/zmij-66703644318e2170/build_script_build-66703644318e2170.d target/debug/build/zmij-66703644318e2170/build-script-build target/debug/libdata_url.rlib target/debug/build/quote-c8e2688b757dd7d5/output target/debug/build/quote-c8e2688b757dd7d5/invoked.timestamp target/debug/build/quote-c8e2688b757dd7d5/stderr target/debug/build/quote-c8e2688b757dd7d5/root-output
git status --short
Chunk ID: d20da6 Wall time: 0.0000 seconds Process exited with code 128 Original token count: 18 Output: fatal: not a git repository (or any of the parent directories): .git
sed -n '120,240p' url/src/lib.rs
Chunk ID: 81b3b7
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 958
Output:
```
*/
#![doc(html_root_url = "https://docs.rs/url/2.3.1")]
#![cfg_attr(
feature = "debugger_visualizer",
feature(debugger_visualizer),
debugger_visualizer(natvis_file = "../../debug_metadata/url.natvis")
)]
pub use form_urlencoded;
#[cfg(feature = "serde")]
extern crate serde;
use crate::host::HostInternal;
use crate::parser::{to_u32, Context, Parser, SchemeType, PATH_SEGMENT, USERINFO};
use percent_encoding::{percent_decode, percent_encode, utf8_percent_encode};
use std::borrow::Borrow;
use std::cmp;
use std::fmt::{self, Write};
use std::hash;
use std::io;
use std::mem;
use std::net::{IpAddr, SocketAddr, ToSocketAddrs};
use std::ops::{Range, RangeFrom, RangeTo};
use std::path::{Path, PathBuf};
use std::str;
use std::convert::TryFrom;
pub use crate::host::Host;
pub use crate::origin::{OpaqueOrigin, Origin};
pub use crate::parser::{ParseError, SyntaxViolation};
pub use crate::path_segments::PathSegmentsMut;
pub use crate::slicing::Position;
pub use form_urlencoded::EncodingOverride;
mod host;
mod origin;
mod parser;
mod path_segments;
mod slicing;
#[doc(hidden)]
pub mod quirks;
/// A parsed URL record.
#[derive(Clone)]
pub struct Url {
/// Syntax in pseudo-BNF:
///
/// url = scheme ":" [ hierarchical | non-hierarchical ] [ "?" query ]? [ "#" fragment ]?
/// non-hierarchical = non-hierarchical-path
/// non-hierarchical-path = /* Does not start with "/" */
/// hierarchical = authority? hierarchical-path
/// authority = "//" userinfo? host [ ":" port ]?
/// userinfo = username [ ":" password ]? "@"
/// hierarchical-path = [ "/" path-segment ]+
serialization: String,
// Components
scheme_end: u32, // Before ':'
username_end: u32, // Before ':' (if a password is given) or '@' (if not)
host_start: u32,
host_end: u32,
host: HostInternal,
port: Option<u16>,
path_start: u32, // Before initial '/', if any
query_start: Option<u32>, // Before '?', unlike Position::QueryStart
fragment_start: Option<u32>, // Before '#', unlike Position::FragmentStart
}
/// Full configuration for the URL parser.
#[derive(Copy, Clone)]
pub struct ParseOptions<'a> {
base_url: Option<&'a Url>,
encoding_override: EncodingOverride<'a>,
violation_fn: Option<&'a dyn Fn(SyntaxViolation)>,
}
impl<'a> ParseOptions<'a> {
/// Change the base URL
pub fn base_url(mut self, new: Option<&'a Url>) -> Self {
self.base_url = new;
self
}
/// Override the character encoding of query strings.
/// This is a legacy concept only relevant for HTML.
pub fn encoding_override(mut self, new: EncodingOverride<'a>) -> Self {
self.encoding_override = new;
self
}
/// Call the provided function or closure for a non-fatal `SyntaxViolation`
/// when it occurs during parsing. Note that since the provided function is
/// `Fn`, the caller might need to utilize _interior mutability_, such as with
/// a `RefCell`, to collect the violations.
///
/// ## Example
/// ```
/// use std::cell::RefCell;
/// use url::{Url, SyntaxViolation};
/// # use url::ParseError;
/// # fn run() -> Result<(), url::ParseError> {
/// let violations = RefCell::new(Vec::new());
/// let url = Url::options()
/// .syntax_violation_callback(Some(&|v| violations.borrow_mut().push(v)))
/// .parse("https:////example.com")?;
/// assert_eq!(url.as_str(), "https://example.com/");
/// assert_eq!(violations.into_inner(),
/// vec!(SyntaxViolation::ExpectedDoubleSlash));
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn syntax_violation_callback(mut self, new: Option<&'a dyn Fn(SyntaxViolation)>) -> Self {
self.violation_fn = new;
self
sed -n '300,420p' url/src/lib.rs
Chunk ID: 68e439
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 994
Output:
/// ```
///
/// # Errors
///
/// If the function can not parse an absolute URL from the given string,
/// a [`ParseError`] variant will be returned.
///
/// [`ParseError`]: enum.ParseError.html
#[inline]
pub fn parse_with_params<I, K, V>(input: &str, iter: I) -> Result<Url, crate::ParseError>
where
I: IntoIterator,
I::Item: Borrow<(K, V)>,
K: AsRef<str>,
V: AsRef<str>,
{
let mut url = Url::options().parse(input);
if let Ok(ref mut url) = url {
url.query_pairs_mut().extend_pairs(iter);
}
url
}
/// https://url.spec.whatwg.org/#potentially-strip-trailing-spaces-from-an-opaque-path
fn strip_trailing_spaces_from_opaque_path(&mut self) {
if !self.cannot_be_a_base() {
return;
}
if self.fragment_start.is_some() {
return;
}
if self.query_start.is_some() {
return;
}
let trailing_space_count = self
.serialization
.chars()
.rev()
.take_while(|c| *c == ' ')
.count();
let start = self.serialization.len() - trailing_space_count;
self.serialization.truncate(start);
}
/// Parse a string as an URL, with this URL as the base URL.
///
/// The inverse of this is [`make_relative`].
///
/// Note: a trailing slash is significant.
/// Without it, the last path component is considered to be a “file” name
/// to be removed to get at the “directory” that is used as the base:
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let base = Url::parse("https://example.net/a/b.html")?;
/// let url = base.join("c.png")?;
/// assert_eq!(url.as_str(), "https://example.net/a/c.png"); // Not /a/b.html/c.png
///
/// let base = Url::parse("https://example.net/a/b/")?;
/// let url = base.join("c.png")?;
/// assert_eq!(url.as_str(), "https://example.net/a/b/c.png");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// # Errors
///
/// If the function can not parse an URL from the given string
/// with this URL as the base URL, a [`ParseError`] variant will be returned.
///
/// [`ParseError`]: enum.ParseError.html
/// [`make_relative`]: #method.make_relative
#[inline]
pub fn join(&self, input: &str) -> Result<Url, crate::ParseError> {
Url::options().base_url(Some(self)).parse(input)
}
/// Creates a relative URL if possible, with this URL as the base URL.
///
/// This is the inverse of [`join`].
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let base = Url::parse("https://example.net/a/b.html")?;
/// let url = Url::parse("https://example.net/a/c.png")?;
/// let relative = base.make_relative(&url);
/// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
///
/// let base = Url::parse("https://example.net/a/b/")?;
/// let url = Url::parse("https://example.net/a/b/c.png")?;
/// let relative = base.make_relative(&url);
/// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("c.png"));
///
/// let base = Url::parse("https://example.net/a/b/")?;
/// let url = Url::parse("https://example.net/a/d/c.png")?;
/// let relative = base.make_relative(&url);
/// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("../d/c.png"));
///
/// let base = Url::parse("https://example.net/a/b.html?c=d")?;
/// let url = Url::parse("https://example.net/a/b.html?e=f")?;
/// let relative = base.make_relative(&url);
/// assert_eq!(relative.as_ref().map(|s| s.as_str()), Some("?e=f"));
/// # Ok(())
sed -n '600,720p' url/src/lib.rs
Chunk ID: 0479e0
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1275
Output:
/// This is for testing rust-url itself.
#[doc(hidden)]
pub fn check_invariants(&self) -> Result<(), String> {
macro_rules! assert {
($x: expr) => {
if !$x {
return Err(format!(
"!( {} ) for URL {:?}",
stringify!($x),
self.serialization
));
}
};
}
macro_rules! assert_eq {
($a: expr, $b: expr) => {
{
let a = $a;
let b = $b;
if a != b {
return Err(format!("{:?} != {:?} ({} != {}) for URL {:?}",
a, b, stringify!($a), stringify!($b),
self.serialization))
}
}
}
}
assert!(self.scheme_end >= 1);
assert!(self.byte_at(0).is_ascii_alphabetic());
assert!(self
.slice(1..self.scheme_end)
.chars()
.all(|c| matches!(c, 'a'..='z' | 'A'..='Z' | '0'..='9' | '+' | '-' | '.')));
assert_eq!(self.byte_at(self.scheme_end), b':');
if self.slice(self.scheme_end + 1..).starts_with("//") {
// URL with authority
if self.username_end != self.serialization.len() as u32 {
match self.byte_at(self.username_end) {
b':' => {
assert!(self.host_start >= self.username_end + 2);
assert_eq!(self.byte_at(self.host_start - 1), b'@');
}
b'@' => assert!(self.host_start == self.username_end + 1),
_ => assert_eq!(self.username_end, self.scheme_end + 3),
}
}
assert!(self.host_start >= self.username_end);
assert!(self.host_end >= self.host_start);
let host_str = self.slice(self.host_start..self.host_end);
match self.host {
HostInternal::None => assert_eq!(host_str, ""),
HostInternal::Ipv4(address) => assert_eq!(host_str, address.to_string()),
HostInternal::Ipv6(address) => {
let h: Host<String> = Host::Ipv6(address);
assert_eq!(host_str, h.to_string())
}
HostInternal::Domain => {
if SchemeType::from(self.scheme()).is_special() {
assert!(!host_str.is_empty())
}
}
}
if self.path_start == self.host_end {
assert_eq!(self.port, None);
} else {
assert_eq!(self.byte_at(self.host_end), b':');
let port_str = self.slice(self.host_end + 1..self.path_start);
assert_eq!(
self.port,
Some(port_str.parse::<u16>().expect("Couldn't parse port?"))
);
}
assert!(
self.path_start as usize == self.serialization.len()
|| matches!(self.byte_at(self.path_start), b'/' | b'#' | b'?')
);
} else {
// Anarchist URL (no authority)
assert_eq!(self.username_end, self.scheme_end + 1);
assert_eq!(self.host_start, self.scheme_end + 1);
assert_eq!(self.host_end, self.scheme_end + 1);
assert_eq!(self.host, HostInternal::None);
assert_eq!(self.port, None);
assert_eq!(self.path_start, self.scheme_end + 1);
}
if let Some(start) = self.query_start {
assert!(start >= self.path_start);
assert_eq!(self.byte_at(start), b'?');
}
if let Some(start) = self.fragment_start {
assert!(start >= self.path_start);
assert_eq!(self.byte_at(start), b'#');
}
if let (Some(query_start), Some(fragment_start)) = (self.query_start, self.fragment_start) {
assert!(fragment_start > query_start);
}
let other = Url::parse(self.as_str()).expect("Failed to parse myself?");
assert_eq!(&self.serialization, &other.serialization);
assert_eq!(self.scheme_end, other.scheme_end);
assert_eq!(self.username_end, other.username_end);
assert_eq!(self.host_start, other.host_start);
assert_eq!(self.host_end, other.host_end);
assert!(
self.host == other.host ||
// XXX No host round-trips to empty host.
// See https://[code-host]/whatwg/url/issues/79
(self.host_str(), other.host_str()) == (None, Some(""))
);
assert_eq!(self.port, other.port);
assert_eq!(self.path_start, other.path_start);
assert_eq!(self.query_start, other.query_start);
assert_eq!(self.fragment_start, other.fragment_start);
Ok(())
}
/// Return the origin of this URL (<https://url.spec.whatwg.org/#origin>)
///
sed -n '440,520p' url/src/parser.rs
Chunk ID: ae6f5f
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 811
Output:
self.serialization.clear();
return self.parse_relative(input, scheme_type, base_url);
}
}
// special authority slashes state
self.log_violation_if(ExpectedDoubleSlash, || {
input
.clone()
.take_while(|&c| matches!(c, '/' | '\\'))
.collect::<String>()
!= "//"
});
self.after_double_slash(remaining, scheme_type, scheme_end)
}
SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end),
}
}
/// Scheme other than file, http, https, ws, ws, ftp.
fn parse_non_special(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
scheme_end: u32,
) -> ParseResult<Url> {
// path or authority state (
if let Some(input) = input.split_prefix("//") {
return self.after_double_slash(input, scheme_type, scheme_end);
}
// Anarchist URL (no authority)
let path_start = to_u32(self.serialization.len())?;
let username_end = path_start;
let host_start = path_start;
let host_end = path_start;
let host = HostInternal::None;
let port = None;
let remaining = if let Some(input) = input.split_prefix('/') {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
} else {
self.parse_cannot_be_a_base_path(input)
};
self.with_query_and_fragment(
scheme_type,
scheme_end,
username_end,
host_start,
host_end,
host,
port,
path_start,
remaining,
)
}
fn parse_file(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
base_file_url: Option<&Url>,
) -> ParseResult<Url> {
use crate::SyntaxViolation::Backslash;
// file state
debug_assert!(self.serialization.is_empty());
let (first_char, input_after_first_char) = input.split_first();
if matches!(first_char, Some('/') | Some('\\')) {
self.log_violation_if(SyntaxViolation::Backslash, || first_char == Some('\\'));
// file slash state
let (next_char, input_after_next_char) = input_after_first_char.split_first();
if matches!(next_char, Some('/') | Some('\\')) {
self.log_violation_if(Backslash, || next_char == Some('\\'));
// file host state
self.serialization.push_str("file://");
let scheme_end = "file".len() as u32;
let host_start = "file://".len() as u32;
let (path_start, mut host, remaining) =
self.parse_file_host(input_after_next_char)?;
let mut host_end = to_u32(self.serialization.len())?;
let mut has_host = !matches!(host, HostInternal::None);
let remaining = if path_start {
sed -n '800,920p' url/src/lib.rs
Chunk ID: 025144
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1024
Output:
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("file:///tmp/foo")?;
/// assert_eq!(url.scheme(), "file");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[inline]
pub fn scheme(&self) -> &str {
self.slice(..self.scheme_end)
}
/// Return whether the URL has an 'authority',
/// which can contain a username, password, host, and port number.
///
/// URLs that do *not* are either path-only like `unix:/run/foo.socket`
/// or cannot-be-a-base like `data:text/plain,Stuff`.
///
/// See also the `authority` method.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert!(url.has_authority());
///
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert!(!url.has_authority());
///
/// let url = Url::parse("data:text/plain,Stuff")?;
/// assert!(!url.has_authority());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[inline]
pub fn has_authority(&self) -> bool {
debug_assert!(self.byte_at(self.scheme_end) == b':');
self.slice(self.scheme_end..).starts_with("://")
}
/// Return the authority of this URL as an ASCII string.
///
/// Non-ASCII domains are punycode-encoded per IDNA if this is the host
/// of a special URL, or percent encoded for non-special URLs.
/// IPv6 addresses are given between `[` and `]` brackets.
/// Ports are omitted if they match the well known port of a special URL.
///
/// Username and password are percent-encoded.
///
/// See also the `has_authority` method.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert_eq!(url.authority(), "");
/// let url = Url::parse("file:///tmp/foo")?;
/// assert_eq!(url.authority(), "");
/// let url = Url::parse("https://user:password@example.com/tmp/foo")?;
/// assert_eq!(url.authority(), "user:password@example.com");
/// let url = Url::parse("irc://àlex.рф.example.com:6667/foo")?;
/// assert_eq!(url.authority(), "%C3%A0lex.%D1%80%D1%84.example.com:6667");
/// let url = Url::parse("http://àlex.рф.example.com:80/foo")?;
/// assert_eq!(url.authority(), "xn--lex-8ka.xn--p1ai.example.com");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn authority(&self) -> &str {
let scheme_separator_len = "://".len() as u32;
if self.has_authority() && self.path_start > self.scheme_end + scheme_separator_len {
self.slice(self.scheme_end + scheme_separator_len..self.path_start)
} else {
""
}
}
/// Return whether this URL is a cannot-be-a-base URL,
/// meaning that parsing a relative URL string with this URL as the base will return an error.
///
/// This is the case if the scheme and `:` delimiter are not followed by a `/` slash,
/// as is typically the case of `data:` and `mailto:` URLs.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert!(!url.cannot_be_a_base());
///
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert!(!url.cannot_be_a_base());
///
/// let url = Url::parse("data:text/plain,Stuff")?;
/// assert!(url.cannot_be_a_base());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[inline]
pub fn cannot_be_a_base(&self) -> bool {
!self.slice(self.scheme_end + 1..).starts_with('/')
}
/// Return the username for this URL (typically the empty string)
/// as a percent-encoded ASCII string.
sed -n '1220,1295p' url/src/lib.rs
Chunk ID: 79c633
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 727
Output:
//
// > This RFC proposes that *all* type parameters are considered in scope
// > for `impl Trait` in return position
fn io_result<T>(opt: Option<T>, message: &str) -> io::Result<T> {
opt.ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, message))
}
let host = io_result(self.host(), "No host name in the URL")?;
let port = io_result(
self.port_or_known_default().or_else(default_port_number),
"No port number in the URL",
)?;
Ok(match host {
Host::Domain(domain) => (domain, port).to_socket_addrs()?.collect(),
Host::Ipv4(ip) => vec![(ip, port).into()],
Host::Ipv6(ip) => vec![(ip, port).into()],
})
}
/// Return the path for this URL, as a percent-encoded ASCII string.
/// For cannot-be-a-base URLs, this is an arbitrary string that doesn’t start with '/'.
/// For other URLs, this starts with a '/' slash
/// and continues with slash-separated path segments.
///
/// # Examples
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("https://example.com/api/versions?page=2")?;
/// assert_eq!(url.path(), "/api/versions");
///
/// let url = Url::parse("https://example.com")?;
/// assert_eq!(url.path(), "/");
///
/// let url = Url::parse("https://example.com/countries/việt nam")?;
/// assert_eq!(url.path(), "/countries/vi%E1%BB%87t%20nam");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn path(&self) -> &str {
match (self.query_start, self.fragment_start) {
(None, None) => self.slice(self.path_start..),
(Some(next_component_start), _) | (None, Some(next_component_start)) => {
self.slice(self.path_start..next_component_start)
}
}
}
/// Unless this URL is cannot-be-a-base,
/// return an iterator of '/' slash-separated path segments,
/// each as a percent-encoded ASCII string.
///
/// Return `None` for cannot-be-a-base URLs.
///
/// When `Some` is returned, the iterator always contains at least one string
/// (which may be empty).
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let url = Url::parse("https://example.com/foo/bar")?;
/// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
/// assert_eq!(path_segments.next(), Some("foo"));
/// assert_eq!(path_segments.next(), Some("bar"));
/// assert_eq!(path_segments.next(), None);
///
/// let url = Url::parse("https://example.com")?;
/// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
sed -n '1580,1688p' url/src/lib.rs
Chunk ID: 16f2f5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1025
Output:
let query = UrlQuery {
url: Some(self),
fragment,
};
form_urlencoded::Serializer::for_suffix(query, query_start + "?".len())
}
fn take_after_path(&mut self) -> String {
match (self.query_start, self.fragment_start) {
(Some(i), _) | (None, Some(i)) => {
let after_path = self.slice(i..).to_owned();
self.serialization.truncate(i as usize);
after_path
}
(None, None) => String::new(),
}
}
/// Change this URL’s path.
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.com")?;
/// url.set_path("api/comments");
/// assert_eq!(url.as_str(), "https://example.com/api/comments");
/// assert_eq!(url.path(), "/api/comments");
///
/// let mut url = Url::parse("https://example.com/api")?;
/// url.set_path("data/report.csv");
/// assert_eq!(url.as_str(), "https://example.com/data/report.csv");
/// assert_eq!(url.path(), "/data/report.csv");
///
/// // `set_path` percent-encodes the given string if it's not already percent-encoded.
/// let mut url = Url::parse("https://example.com")?;
/// url.set_path("api/some comments");
/// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
/// assert_eq!(url.path(), "/api/some%20comments");
///
/// // `set_path` will not double percent-encode the string if it's already percent-encoded.
/// let mut url = Url::parse("https://example.com")?;
/// url.set_path("api/some%20comments");
/// assert_eq!(url.as_str(), "https://example.com/api/some%20comments");
/// assert_eq!(url.path(), "/api/some%20comments");
///
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn set_path(&mut self, mut path: &str) {
let after_path = self.take_after_path();
let old_after_path_pos = to_u32(self.serialization.len()).unwrap();
let cannot_be_a_base = self.cannot_be_a_base();
let scheme_type = SchemeType::from(self.scheme());
self.serialization.truncate(self.path_start as usize);
self.mutate(|parser| {
if cannot_be_a_base {
if path.starts_with('/') {
parser.serialization.push_str("%2F");
path = &path[1..];
}
parser.parse_cannot_be_a_base_path(parser::Input::new(path));
} else {
let mut has_host = true; // FIXME
parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
}
});
self.restore_after_path(old_after_path_pos, &after_path);
}
/// Return an object with methods to manipulate this URL’s path segments.
///
/// Return `Err(())` if this URL is cannot-be-a-base.
#[allow(clippy::result_unit_err)]
pub fn path_segments_mut(&mut self) -> Result<PathSegmentsMut<'_>, ()> {
if self.cannot_be_a_base() {
Err(())
} else {
Ok(path_segments::new(self))
}
}
fn restore_after_path(&mut self, old_after_path_position: u32, after_path: &str) {
let new_after_path_position = to_u32(self.serialization.len()).unwrap();
let adjust = |index: &mut u32| {
*index -= old_after_path_position;
*index += new_after_path_position;
};
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
self.serialization.push_str(after_path)
}
/// Change this URL’s port number.
///
/// Note that default port numbers are not reflected in the serialization.
///
/// If this URL is cannot-be-a-base, does not have a host, or has the `file` scheme;
/// do nothing and return `Err`.
///
/// # Examples
sed -n '1,190p' url/src/slicing.rs
Chunk ID: 7618cb
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1604
Output:
// Copyright 2016 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use crate::Url;
use std::ops::{Index, Range, RangeFrom, RangeFull, RangeTo};
impl Index<RangeFull> for Url {
type Output = str;
fn index(&self, _: RangeFull) -> &str {
&self.serialization
}
}
impl Index<RangeFrom<Position>> for Url {
type Output = str;
fn index(&self, range: RangeFrom<Position>) -> &str {
&self.serialization[self.index(range.start)..]
}
}
impl Index<RangeTo<Position>> for Url {
type Output = str;
fn index(&self, range: RangeTo<Position>) -> &str {
&self.serialization[..self.index(range.end)]
}
}
impl Index<Range<Position>> for Url {
type Output = str;
fn index(&self, range: Range<Position>) -> &str {
&self.serialization[self.index(range.start)..self.index(range.end)]
}
}
/// Indicates a position within a URL based on its components.
///
/// A range of positions can be used for slicing `Url`:
///
/// ```rust
/// # use url::{Url, Position};
/// # fn something(some_url: Url) {
/// let serialization: &str = &some_url[..];
/// let serialization_without_fragment: &str = &some_url[..Position::AfterQuery];
/// let authority: &str = &some_url[Position::BeforeUsername..Position::AfterPort];
/// let data_url_payload: &str = &some_url[Position::BeforePath..Position::AfterQuery];
/// let scheme_relative: &str = &some_url[Position::BeforeUsername..];
/// # }
/// ```
///
/// In a pseudo-grammar (where `[`…`]?` makes a sub-sequence optional),
/// URL components and delimiters that separate them are:
///
/// ```notrust
/// url =
/// scheme ":"
/// [ "//" [ username [ ":" password ]? "@" ]? host [ ":" port ]? ]?
/// path [ "?" query ]? [ "#" fragment ]?
/// ```
///
/// When a given component is not present,
/// its "before" and "after" position are the same
/// (so that `&some_url[BeforeFoo..AfterFoo]` is the empty string)
/// and component ordering is preserved
/// (so that a missing query "is between" a path and a fragment).
///
/// The end of a component and the start of the next are either the same or separate
/// by a delimiter.
/// (Not that the initial `/` of a path is considered part of the path here, not a delimiter.)
/// For example, `&url[..BeforeFragment]` would include a `#` delimiter (if present in `url`),
/// so `&url[..AfterQuery]` might be desired instead.
///
/// `BeforeScheme` and `AfterFragment` are always the start and end of the entire URL,
/// so `&url[BeforeScheme..X]` is the same as `&url[..X]`
/// and `&url[X..AfterFragment]` is the same as `&url[X..]`.
#[derive(Copy, Clone, Debug)]
pub enum Position {
BeforeScheme,
AfterScheme,
BeforeUsername,
AfterUsername,
BeforePassword,
AfterPassword,
BeforeHost,
AfterHost,
BeforePort,
AfterPort,
BeforePath,
AfterPath,
BeforeQuery,
AfterQuery,
BeforeFragment,
AfterFragment,
}
impl Url {
#[inline]
fn index(&self, position: Position) -> usize {
match position {
Position::BeforeScheme => 0,
Position::AfterScheme => self.scheme_end as usize,
Position::BeforeUsername => {
if self.has_authority() {
self.scheme_end as usize + "://".len()
} else {
debug_assert!(self.byte_at(self.scheme_end) == b':');
debug_assert!(self.scheme_end + ":".len() as u32 == self.username_end);
self.scheme_end as usize + ":".len()
}
}
Position::AfterUsername => self.username_end as usize,
Position::BeforePassword => {
if self.has_authority() && self.byte_at(self.username_end) == b':' {
self.username_end as usize + ":".len()
} else {
debug_assert!(self.username_end == self.host_start);
self.username_end as usize
}
}
Position::AfterPassword => {
if self.has_authority() && self.byte_at(self.username_end) == b':' {
debug_assert!(self.byte_at(self.host_start - "@".len() as u32) == b'@');
self.host_start as usize - "@".len()
} else {
debug_assert!(self.username_end == self.host_start);
self.host_start as usize
}
}
Position::BeforeHost => self.host_start as usize,
Position::AfterHost => self.host_end as usize,
Position::BeforePort => {
if self.port.is_some() {
debug_assert!(self.byte_at(self.host_end) == b':');
self.host_end as usize + ":".len()
} else {
self.host_end as usize
}
}
Position::AfterPort => self.path_start as usize,
Position::BeforePath => self.path_start as usize,
Position::AfterPath => match (self.query_start, self.fragment_start) {
(Some(q), _) => q as usize,
(None, Some(f)) => f as usize,
(None, None) => self.serialization.len(),
},
Position::BeforeQuery => match (self.query_start, self.fragment_start) {
(Some(q), _) => {
debug_assert!(self.byte_at(q) == b'?');
q as usize + "?".len()
}
(None, Some(f)) => f as usize,
(None, None) => self.serialization.len(),
},
Position::AfterQuery => match self.fragment_start {
None => self.serialization.len(),
Some(f) => f as usize,
},
Position::BeforeFragment => match self.fragment_start {
Some(f) => {
debug_assert!(self.byte_at(f) == b'#');
f as usize + "#".len()
}
None => self.serialization.len(),
},
Position::AfterFragment => self.serialization.len(),
}
}
}
sed -n '700,830p' url/src/parser.rs
Chunk ID: 24da89
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1371
Output:
path_start,
query_start,
fragment_start,
})
}
}
fn parse_relative(
mut self,
input: Input<'_>,
scheme_type: SchemeType,
base_url: &Url,
) -> ParseResult<Url> {
// relative state
debug_assert!(self.serialization.is_empty());
let (first_char, input_after_first_char) = input.split_first();
match first_char {
None => {
// Copy everything except the fragment
let before_fragment = match base_url.fragment_start {
Some(i) => &base_url.serialization[..i as usize],
None => &*base_url.serialization,
};
self.serialization.push_str(before_fragment);
Ok(Url {
serialization: self.serialization,
fragment_start: None,
..*base_url
})
}
Some('?') => {
// Copy everything up to the query string
let before_query = match (base_url.query_start, base_url.fragment_start) {
(None, None) => &*base_url.serialization,
(Some(i), _) | (None, Some(i)) => base_url.slice(..i),
};
self.serialization.push_str(before_query);
let (query_start, fragment_start) =
self.parse_query_and_fragment(scheme_type, base_url.scheme_end, input)?;
Ok(Url {
serialization: self.serialization,
query_start,
fragment_start,
..*base_url
})
}
Some('#') => self.fragment_only(base_url, input),
Some('/') | Some('\\') => {
let (slashes_count, remaining) = input.count_matching(|c| matches!(c, '/' | '\\'));
if slashes_count >= 2 {
self.log_violation_if(SyntaxViolation::ExpectedDoubleSlash, || {
input
.clone()
.take_while(|&c| matches!(c, '/' | '\\'))
.collect::<String>()
!= "//"
});
let scheme_end = base_url.scheme_end;
debug_assert!(base_url.byte_at(scheme_end) == b':');
self.serialization
.push_str(base_url.slice(..scheme_end + 1));
if let Some(after_prefix) = input.split_prefix("//") {
return self.after_double_slash(after_prefix, scheme_type, scheme_end);
}
return self.after_double_slash(remaining, scheme_type, scheme_end);
}
let path_start = base_url.path_start;
self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
path_start as usize,
input_after_first_char,
);
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
base_url.host,
base_url.port,
base_url.path_start,
remaining,
)
}
_ => {
let before_query = match (base_url.query_start, base_url.fragment_start) {
(None, None) => &*base_url.serialization,
(Some(i), _) | (None, Some(i)) => base_url.slice(..i),
};
self.serialization.push_str(before_query);
// FIXME spec says just "remove last entry", not the "pop" algorithm
self.pop_path(scheme_type, base_url.path_start as usize);
// A special url always has a path.
// A path always starts with '/'
if self.serialization.len() == base_url.path_start as usize
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
base_url.path_start as usize,
remaining,
),
_ => {
self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
}
};
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
base_url.host,
base_url.port,
base_url.path_start,
remaining,
)
}
}
}
fn after_double_slash(
mut self,
input: Input<'_>,
sed -n '1120,1270p' url/src/parser.rs
Chunk ID: 909d7c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1765
Output:
let mut opt_port = Some(port as u16);
if !has_any_digit || opt_port == default_port() {
opt_port = None;
}
Ok((opt_port, input))
}
pub fn parse_path_start<'i>(
&mut self,
scheme_type: SchemeType,
has_host: &mut bool,
input: Input<'i>,
) -> Input<'i> {
let path_start = self.serialization.len();
let (maybe_c, remaining) = input.split_first();
// If url is special, then:
if scheme_type.is_special() {
if maybe_c == Some('\\') {
// If c is U+005C (\), validation error.
self.log_violation(SyntaxViolation::Backslash);
}
// A special URL always has a non-empty path.
if !self.serialization.ends_with('/') {
self.serialization.push('/');
// We have already made sure the forward slash is present.
if maybe_c == Some('/') || maybe_c == Some('\\') {
return self.parse_path(scheme_type, has_host, path_start, remaining);
}
}
return self.parse_path(scheme_type, has_host, path_start, input);
} else if maybe_c == Some('?') || maybe_c == Some('#') {
// Otherwise, if state override is not given and c is U+003F (?),
// set url’s query to the empty string and state to query state.
// Otherwise, if state override is not given and c is U+0023 (#),
// set url’s fragment to the empty string and state to fragment state.
// The query and path states will be handled by the caller.
return input;
}
if maybe_c.is_some() && maybe_c != Some('/') {
self.serialization.push('/');
}
// Otherwise, if c is not the EOF code point:
self.parse_path(scheme_type, has_host, path_start, input)
}
pub fn parse_path<'i>(
&mut self,
scheme_type: SchemeType,
has_host: &mut bool,
path_start: usize,
mut input: Input<'i>,
) -> Input<'i> {
// Relative path state
loop {
let segment_start = self.serialization.len();
let mut ends_with_slash = false;
loop {
let input_before_c = input.clone();
let (c, utf8_c) = if let Some(x) = input.next_utf8() {
x
} else {
break;
};
match c {
'/' if self.context != Context::PathSegmentSetter => {
self.serialization.push(c);
ends_with_slash = true;
break;
}
'\\' if self.context != Context::PathSegmentSetter
&& scheme_type.is_special() =>
{
self.log_violation(SyntaxViolation::Backslash);
self.serialization.push('/');
ends_with_slash = true;
break;
}
'?' | '#' if self.context == Context::UrlParser => {
input = input_before_c;
break;
}
_ => {
self.check_url_code_point(c, &input);
if self.context == Context::PathSegmentSetter {
if scheme_type.is_special() {
self.serialization
.extend(utf8_percent_encode(utf8_c, SPECIAL_PATH_SEGMENT));
} else {
self.serialization
.extend(utf8_percent_encode(utf8_c, PATH_SEGMENT));
}
} else {
self.serialization.extend(utf8_percent_encode(utf8_c, PATH));
}
}
}
}
let segment_before_slash = if ends_with_slash {
&self.serialization[segment_start..self.serialization.len() - 1]
} else {
&self.serialization[segment_start..self.serialization.len()]
};
match segment_before_slash {
// If buffer is a double-dot path segment, shorten url’s path,
".." | "%2e%2e" | "%2e%2E" | "%2E%2e" | "%2E%2E" | "%2e." | "%2E." | ".%2e"
| ".%2E" => {
debug_assert!(self.serialization.as_bytes()[segment_start - 1] == b'/');
self.serialization.truncate(segment_start);
if self.serialization.ends_with('/')
&& Parser::last_slash_can_be_removed(&self.serialization, path_start)
{
self.serialization.pop();
}
self.shorten_path(scheme_type, path_start);
// and then if neither c is U+002F (/), nor url is special and c is U+005C (\), append the empty string to url’s path.
if ends_with_slash && !self.serialization.ends_with('/') {
self.serialization.push('/');
}
}
// Otherwise, if buffer is a single-dot path segment and if neither c is U+002F (/),
// nor url is special and c is U+005C (\), append the empty string to url’s path.
"." | "%2e" | "%2E" => {
self.serialization.truncate(segment_start);
if !self.serialization.ends_with('/') {
self.serialization.push('/');
}
}
_ => {
// If url’s scheme is "file", url’s path is empty, and buffer is a Windows drive letter, then
if scheme_type.is_file() && is_windows_drive_letter(segment_before_slash) {
// Replace the second code point in buffer with U+003A (:).
if let Some(c) = segment_before_slash.chars().next() {
self.serialization.truncate(segment_start);
self.serialization.push(c);
self.serialization.push(':');
if ends_with_slash {
self.serialization.push('/');
}
}
// If url’s host is neither the empty string nor null,
// validation error, set url’s host to the empty string.
if *has_host {
self.log_violation(SyntaxViolation::FileWithHostAndWindowsDrive);
*has_host = false; // FIXME account for this in callers
}
}
}
}
if !ends_with_slash {
sed -n '1270,1345p' url/src/parser.rs
Chunk ID: 12646b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 759
Output:
if !ends_with_slash {
break;
}
}
if scheme_type.is_file() {
// while url’s path’s size is greater than 1
// and url’s path[0] is the empty string,
// validation error, remove the first item from url’s path.
//FIXME: log violation
let path = self.serialization.split_off(path_start);
self.serialization.push('/');
self.serialization.push_str(path.trim_start_matches('/'));
}
input
}
fn last_slash_can_be_removed(serialization: &str, path_start: usize) -> bool {
let url_before_segment = &serialization[..serialization.len() - 1];
if let Some(segment_before_start) = url_before_segment.rfind('/') {
// Do not remove the root slash
segment_before_start >= path_start
// Or a windows drive letter slash
&& !path_starts_with_windows_drive_letter(&serialization[segment_before_start..])
} else {
false
}
}
/// https://url.spec.whatwg.org/#shorten-a-urls-path
fn shorten_path(&mut self, scheme_type: SchemeType, path_start: usize) {
// If path is empty, then return.
if self.serialization.len() == path_start {
return;
}
// If url’s scheme is "file", path’s size is 1, and path[0] is a normalized Windows drive letter, then return.
if scheme_type.is_file()
&& is_normalized_windows_drive_letter(&self.serialization[path_start..])
{
return;
}
// Remove path’s last item.
self.pop_path(scheme_type, path_start);
}
/// https://url.spec.whatwg.org/#pop-a-urls-path
fn pop_path(&mut self, scheme_type: SchemeType, path_start: usize) {
if self.serialization.len() > path_start {
let slash_position = self.serialization[path_start..].rfind('/').unwrap();
// + 1 since rfind returns the position before the slash.
let segment_start = path_start + slash_position + 1;
// Don’t pop a Windows drive letter
if !(scheme_type.is_file()
&& is_normalized_windows_drive_letter(&self.serialization[segment_start..]))
{
self.serialization.truncate(segment_start);
}
}
}
pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
loop {
let input_before_c = input.clone();
match input.next_utf8() {
Some(('?', _)) | Some(('#', _)) if self.context == Context::UrlParser => {
return input_before_c
}
Some((c, utf8_c)) => {
self.check_url_code_point(c, &input);
self.serialization
.extend(utf8_percent_encode(utf8_c, CONTROLS));
}
None => return input,
}
}
}
sed -n '1345,1465p' url/src/parser.rs
Chunk ID: aa58e0
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 999
Output:
}
#[allow(clippy::too_many_arguments)]
fn with_query_and_fragment(
mut self,
scheme_type: SchemeType,
scheme_end: u32,
username_end: u32,
host_start: u32,
host_end: u32,
host: HostInternal,
port: Option<u16>,
path_start: u32,
remaining: Input<'_>,
) -> ParseResult<Url> {
let (query_start, fragment_start) =
self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
Ok(Url {
serialization: self.serialization,
scheme_end,
username_end,
host_start,
host_end,
host,
port,
path_start,
query_start,
fragment_start,
})
}
/// Return (query_start, fragment_start)
fn parse_query_and_fragment(
&mut self,
scheme_type: SchemeType,
scheme_end: u32,
mut input: Input<'_>,
) -> ParseResult<(Option<u32>, Option<u32>)> {
let mut query_start = None;
match input.next() {
Some('#') => {}
Some('?') => {
query_start = Some(to_u32(self.serialization.len())?);
self.serialization.push('?');
let remaining = self.parse_query(scheme_type, scheme_end, input);
if let Some(remaining) = remaining {
input = remaining
} else {
return Ok((query_start, None));
}
}
None => return Ok((None, None)),
_ => panic!("Programming error. parse_query_and_fragment() called without ? or #"),
}
let fragment_start = to_u32(self.serialization.len())?;
self.serialization.push('#');
self.parse_fragment(input);
Ok((query_start, Some(fragment_start)))
}
pub fn parse_query<'i>(
&mut self,
scheme_type: SchemeType,
scheme_end: u32,
mut input: Input<'i>,
) -> Option<Input<'i>> {
let len = input.chars.as_str().len();
let mut query = String::with_capacity(len); // FIXME: use a streaming decoder instead
let mut remaining = None;
while let Some(c) = input.next() {
if c == '#' && self.context == Context::UrlParser {
remaining = Some(input);
break;
} else {
self.check_url_code_point(c, &input);
query.push(c);
}
}
let encoding = match &self.serialization[..scheme_end as usize] {
"http" | "https" | "file" | "ftp" => self.query_encoding_override,
_ => None,
};
let query_bytes = if let Some(o) = encoding {
o(&query)
} else {
query.as_bytes().into()
};
let set = if scheme_type.is_special() {
SPECIAL_QUERY
} else {
QUERY
};
self.serialization.extend(percent_encode(&query_bytes, set));
remaining
}
fn fragment_only(mut self, base_url: &Url, mut input: Input<'_>) -> ParseResult<Url> {
let before_fragment = match base_url.fragment_start {
Some(i) => base_url.slice(..i),
None => &*base_url.serialization,
};
debug_assert!(self.serialization.is_empty());
self.serialization
.reserve(before_fragment.len() + input.chars.as_str().len());
self.serialization.push_str(before_fragment);
self.serialization.push('#');
let next = input.next();
debug_assert!(next == Some('#'));
self.parse_fragment(input);
Ok(Url {
serialization: self.serialization,
fragment_start: Some(to_u32(before_fragment.len())?),
..*base_url
})
}
pub fn parse_fragment(&mut self, mut input: Input<'_>) {
while let Some((c, utf8_c)) = input.next_utf8() {
if c == '\0' {
sed -n '830,940p' url/src/parser.rs
Chunk ID: aad491
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1059
Output:
input: Input<'_>,
scheme_type: SchemeType,
scheme_end: u32,
) -> ParseResult<Url> {
self.serialization.push('/');
self.serialization.push('/');
// authority state
let before_authority = self.serialization.len();
let (username_end, remaining) = self.parse_userinfo(input, scheme_type)?;
let has_authority = before_authority != self.serialization.len();
// host state
let host_start = to_u32(self.serialization.len())?;
let (host_end, host, port, remaining) =
self.parse_host_and_port(remaining, scheme_end, scheme_type)?;
if host == HostInternal::None && has_authority {
return Err(ParseError::EmptyHost);
}
// path state
let path_start = to_u32(self.serialization.len())?;
let remaining = self.parse_path_start(scheme_type, &mut true, remaining);
self.with_query_and_fragment(
scheme_type,
scheme_end,
username_end,
host_start,
host_end,
host,
port,
path_start,
remaining,
)
}
/// Return (username_end, remaining)
fn parse_userinfo<'i>(
&mut self,
mut input: Input<'i>,
scheme_type: SchemeType,
) -> ParseResult<(u32, Input<'i>)> {
let mut last_at = None;
let mut remaining = input.clone();
let mut char_count = 0;
while let Some(c) = remaining.next() {
match c {
'@' => {
if last_at.is_some() {
self.log_violation(SyntaxViolation::UnencodedAtSign)
} else {
self.log_violation(SyntaxViolation::EmbeddedCredentials)
}
last_at = Some((char_count, remaining.clone()))
}
'/' | '?' | '#' => break,
'\\' if scheme_type.is_special() => break,
_ => (),
}
char_count += 1;
}
let (mut userinfo_char_count, remaining) = match last_at {
None => return Ok((to_u32(self.serialization.len())?, input)),
Some((0, remaining)) => {
// Otherwise, if one of the following is true
// c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#)
// url is special and c is U+005C (\)
// If @ flag is set and buffer is the empty string, validation error, return failure.
if let (Some(c), _) = remaining.split_first() {
if c == '/' || c == '?' || c == '#' || (scheme_type.is_special() && c == '\\') {
return Err(ParseError::EmptyHost);
}
}
return Ok((to_u32(self.serialization.len())?, remaining));
}
Some(x) => x,
};
let mut username_end = None;
let mut has_password = false;
let mut has_username = false;
while userinfo_char_count > 0 {
let (c, utf8_c) = input.next_utf8().unwrap();
userinfo_char_count -= 1;
if c == ':' && username_end.is_none() {
// Start parsing password
username_end = Some(to_u32(self.serialization.len())?);
// We don't add a colon if the password is empty
if userinfo_char_count > 0 {
self.serialization.push(':');
has_password = true;
}
} else {
if !has_password {
has_username = true;
}
self.check_url_code_point(c, &input);
self.serialization
.extend(utf8_percent_encode(utf8_c, USERINFO));
}
}
let username_end = match username_end {
Some(i) => i,
None => to_u32(self.serialization.len())?,
};
if has_username || has_password {
self.serialization.push('@');
}
Ok((username_end, remaining))
}
fn parse_host_and_port<'i>(
&mut self,
input: Input<'i>,
sed -n '920,1120p' url/src/lib.rs
Chunk ID: 4a1d34
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1635
Output:
/// as a percent-encoded ASCII string.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert_eq!(url.username(), "rms");
///
/// let url = Url::parse("ftp://:secret123@example.com")?;
/// assert_eq!(url.username(), "");
///
/// let url = Url::parse("https://example.com")?;
/// assert_eq!(url.username(), "");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn username(&self) -> &str {
let scheme_separator_len = "://".len() as u32;
if self.has_authority() && self.username_end > self.scheme_end + scheme_separator_len {
self.slice(self.scheme_end + scheme_separator_len..self.username_end)
} else {
""
}
}
/// Return the password for this URL, if any, as a percent-encoded ASCII string.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms:secret123@example.com")?;
/// assert_eq!(url.password(), Some("secret123"));
///
/// let url = Url::parse("ftp://:secret123@example.com")?;
/// assert_eq!(url.password(), Some("secret123"));
///
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert_eq!(url.password(), None);
///
/// let url = Url::parse("https://example.com")?;
/// assert_eq!(url.password(), None);
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn password(&self) -> Option<&str> {
// This ':' is not the one marking a port number since a host can not be empty.
// (Except for file: URLs, which do not have port numbers.)
if self.has_authority()
&& self.username_end != self.serialization.len() as u32
&& self.byte_at(self.username_end) == b':'
{
debug_assert!(self.byte_at(self.host_start - 1) == b'@');
Some(self.slice(self.username_end + 1..self.host_start - 1))
} else {
None
}
}
/// Equivalent to `url.host().is_some()`.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert!(url.has_host());
///
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert!(!url.has_host());
///
/// let url = Url::parse("data:text/plain,Stuff")?;
/// assert!(!url.has_host());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn has_host(&self) -> bool {
!matches!(self.host, HostInternal::None)
}
/// Return the string representation of the host (domain or IP address) for this URL, if any.
///
/// Non-ASCII domains are punycode-encoded per IDNA if this is the host
/// of a special URL, or percent encoded for non-special URLs.
/// IPv6 addresses are given between `[` and `]` brackets.
///
/// Cannot-be-a-base URLs (typical of `data:` and `mailto:`) and some `file:` URLs
/// don’t have a host.
///
/// See also the `host` method.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("https://127.0.0.1/index.html")?;
/// assert_eq!(url.host_str(), Some("127.0.0.1"));
///
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert_eq!(url.host_str(), Some("example.com"));
///
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert_eq!(url.host_str(), None);
///
/// let url = Url::parse("data:text/plain,Stuff")?;
/// assert_eq!(url.host_str(), None);
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn host_str(&self) -> Option<&str> {
if self.has_host() {
Some(self.slice(self.host_start..self.host_end))
} else {
None
}
}
/// Return the parsed representation of the host for this URL.
/// Non-ASCII domain labels are punycode-encoded per IDNA if this is the host
/// of a special URL, or percent encoded for non-special URLs.
///
/// Cannot-be-a-base URLs (typical of `data:` and `mailto:`) and some `file:` URLs
/// don’t have a host.
///
/// See also the `host_str` method.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("https://127.0.0.1/index.html")?;
/// assert!(url.host().is_some());
///
/// let url = Url::parse("ftp://rms@example.com")?;
/// assert!(url.host().is_some());
///
/// let url = Url::parse("unix:/run/foo.socket")?;
/// assert!(url.host().is_none());
///
/// let url = Url::parse("data:text/plain,Stuff")?;
/// assert!(url.host().is_none());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn host(&self) -> Option<Host<&str>> {
match self.host {
HostInternal::None => None,
HostInternal::Domain => Some(Host::Domain(self.slice(self.host_start..self.host_end))),
HostInternal::Ipv4(address) => Some(Host::Ipv4(address)),
HostInternal::Ipv6(address) => Some(Host::Ipv6(address)),
}
}
/// If this URL has a host and it is a domain name (not an IP address), return it.
/// Non-ASCII domains are punycode-encoded per IDNA if this is the host
/// of a special URL, or percent encoded for non-special URLs.
///
/// # Examples
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url = Url::parse("https://127.0.0.1/")?;
/// assert_eq!(url.domain(), None);
///
/// let url = Url::parse("mailto:rms@example.net")?;
/// assert_eq!(url.domain(), None);
///
/// let url = Url::parse("https://example.com/")?;
/// assert_eq!(url.domain(), Some("example.com"));
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn domain(&self) -> Option<&str> {
match self.host {
HostInternal::Domain => Some(self.slice(self.host_start..self.host_end)),
_ => None,
sed -n '1,280p' url/src/path_segments.rs
Chunk ID: ac1fa7
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 2168
Output:
// Copyright 2016 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use crate::parser::{self, to_u32, SchemeType};
use crate::Url;
use std::str;
/// Exposes methods to manipulate the path of an URL that is not cannot-be-base.
///
/// The path always starts with a `/` slash, and is made of slash-separated segments.
/// There is always at least one segment (which may be the empty string).
///
/// Examples:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("mailto:me@example.com")?;
/// assert!(url.path_segments_mut().is_err());
///
/// let mut url = Url::parse("http://example.net/foo/index.html")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .pop().push("img").push("2/100%.png");
/// assert_eq!(url.as_str(), "http://example.net/foo/img/2%2F100%25.png");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[derive(Debug)]
pub struct PathSegmentsMut<'a> {
url: &'a mut Url,
after_first_slash: usize,
after_path: String,
old_after_path_position: u32,
}
// Not re-exported outside the crate
pub fn new(url: &mut Url) -> PathSegmentsMut<'_> {
let after_path = url.take_after_path();
let old_after_path_position = to_u32(url.serialization.len()).unwrap();
// Special urls always have a non empty path
if SchemeType::from(url.scheme()).is_special() {
debug_assert!(url.byte_at(url.path_start) == b'/');
} else {
debug_assert!(
url.serialization.len() == url.path_start as usize
|| url.byte_at(url.path_start) == b'/'
);
}
PathSegmentsMut {
after_first_slash: url.path_start as usize + "/".len(),
url,
old_after_path_position,
after_path,
}
}
impl<'a> Drop for PathSegmentsMut<'a> {
fn drop(&mut self) {
self.url
.restore_after_path(self.old_after_path_position, &self.after_path)
}
}
impl<'a> PathSegmentsMut<'a> {
/// Remove all segments in the path, leaving the minimal `url.path() == "/"`.
///
/// Returns `&mut Self` so that method calls can be chained.
///
/// Example:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .clear().push("logout");
/// assert_eq!(url.as_str(), "https://[code-host]/logout");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn clear(&mut self) -> &mut Self {
self.url.serialization.truncate(self.after_first_slash);
self
}
/// Remove the last segment of this URL’s path if it is empty,
/// except if these was only one segment to begin with.
///
/// In other words, remove one path trailing slash, if any,
/// unless it is also the initial slash (so this does nothing if `url.path() == "/")`.
///
/// Returns `&mut Self` so that method calls can be chained.
///
/// Example:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .push("pulls");
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url//pulls");
///
/// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .pop_if_empty().push("pulls");
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url/pulls");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn pop_if_empty(&mut self) -> &mut Self {
if self.after_first_slash >= self.url.serialization.len() {
return self;
}
if self.url.serialization[self.after_first_slash..].ends_with('/') {
self.url.serialization.pop();
}
self
}
/// Remove the last segment of this URL’s path.
///
/// If the path only has one segment, make it empty such that `url.path() == "/"`.
///
/// Returns `&mut Self` so that method calls can be chained.
pub fn pop(&mut self) -> &mut Self {
if self.after_first_slash >= self.url.serialization.len() {
return self;
}
let last_slash = self.url.serialization[self.after_first_slash..]
.rfind('/')
.unwrap_or(0);
self.url
.serialization
.truncate(self.after_first_slash + last_slash);
self
}
/// Append the given segment at the end of this URL’s path.
///
/// See the documentation for `.extend()`.
///
/// Returns `&mut Self` so that method calls can be chained.
pub fn push(&mut self, segment: &str) -> &mut Self {
self.extend(Some(segment))
}
/// Append each segment from the given iterator at the end of this URL’s path.
///
/// Each segment is percent-encoded like in `Url::parse` or `Url::join`,
/// except that `%` and `/` characters are also encoded (to `%25` and `%2F`).
/// This is unlike `Url::parse` where `%` is left as-is in case some of the input
/// is already percent-encoded, and `/` denotes a path segment separator.)
///
/// Note that, in addition to slashes between new segments,
/// this always adds a slash between the existing path and the new segments
/// *except* if the existing path is `"/"`.
/// If the previous last segment was empty (if the path had a trailing slash)
/// the path after `.extend()` will contain two consecutive slashes.
/// If that is undesired, call `.pop_if_empty()` first.
///
/// To obtain a behavior similar to `Url::join`, call `.pop()` unconditionally first.
///
/// Returns `&mut Self` so that method calls can be chained.
///
/// Example:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/")?;
/// let org = "servo";
/// let repo = "rust-url";
/// let issue_number = "188";
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .extend(&[org, repo, "issues", issue_number]);
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url/issues/188");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// In order to make sure that parsing the serialization of an URL gives the same URL,
/// a segment is ignored if it is `"."` or `".."`:
///
/// ```rust
/// use url::Url;
/// # use std::error::Error;
///
/// # fn run() -> Result<(), Box<dyn Error>> {
/// let mut url = Url::parse("https://[code-host]/servo")?;
/// url.path_segments_mut().map_err(|_| "cannot be base")?
/// .extend(&["..", "rust-url", ".", "pulls"]);
/// assert_eq!(url.as_str(), "https://[code-host]/servo/rust-url/pulls");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn extend<I>(&mut self, segments: I) -> &mut Self
where
I: IntoIterator,
I::Item: AsRef<str>,
{
let scheme_type = SchemeType::from(self.url.scheme());
let path_start = self.url.path_start as usize;
self.url.mutate(|parser| {
parser.context = parser::Context::PathSegmentSetter;
for segment in segments {
let segment = segment.as_ref();
if matches!(segment, "." | "..") {
continue;
}
if parser.serialization.len() > path_start + 1
// Non special url's path might still be empty
|| parser.serialization.len() == path_start
{
parser.serialization.push('/');
}
let mut has_host = true; // FIXME account for this?
parser.parse_path(
scheme_type,
&mut has_host,
path_start,
parser::Input::new(segment),
);
}
});
self
}
}
rg -n "check_invariants|Position::AfterPort|Position::BeforePath|non_special|cannot_be_a_base|Url::parse\(" url/tests url/srcChunk ID: 1fd4e3
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 5427
Output:
url/src/slicing.rs:49:/// let authority: &str = &some_url[Position::BeforeUsername..Position::AfterPort];
url/src/slicing.rs:50:/// let data_url_payload: &str = &some_url[Position::BeforePath..Position::AfterQuery];
url/src/slicing.rs:152: Position::AfterPort => self.path_start as usize,
url/src/slicing.rs:154: Position::BeforePath => self.path_start as usize,
url/src/origin.rs:18: let result = Url::parse(url.path());
url/tests/data.rs:45: let base = match Url::parse(&base) {
url/tests/data.rs:60: Url::parse(&input)
url/tests/data.rs:86: passed &= check_invariants(&url, &format!("invariants for {:?}", input), None);
url/tests/data.rs:136: let mut url = Url::parse(&href).unwrap();
url/tests/data.rs:138: passed &= check_invariants(&url, &name, comment_ref);
url/tests/data.rs:147: passed &= check_invariants(&url, &name, comment_ref);
url/tests/data.rs:154:fn check_invariants(url: &Url, name: &str, comment: Option<&str>) -> bool {
url/tests/data.rs:156: if let Err(e) = url.check_invariants() {
url/src/quirks.rs:86: *url = Url::parse(value)?;
url/src/quirks.rs:143: &url[Position::BeforeHost..Position::AfterPort]
url/src/quirks.rs:150: if url.cannot_be_a_base() {
url/src/quirks.rs:202: if url.cannot_be_a_base() {
url/src/quirks.rs:238: &url[Position::BeforePort..Position::AfterPort]
url/src/quirks.rs:246: // has_host implies !cannot_be_a_base
url/src/quirks.rs:273: if url.cannot_be_a_base() {
url/src/lib.rs:22:assert!(Url::parse("http://[:::1]") == Err(ParseError::InvalidIpv6Address))
url/src/lib.rs:31:let issue_list_url = Url::parse(
url/src/lib.rs:46:assert!(&issue_list_url[Position::BeforePath..] == "/rust-lang/rust/issues?labels=E-easy&state=open");
url/src/lib.rs:48:assert!(!issue_list_url.cannot_be_a_base());
url/src/lib.rs:63:let data_url = Url::parse("data:text/plain,Hello?World#")?;
url/src/lib.rs:65:assert!(data_url.cannot_be_a_base());
url/src/lib.rs:93:assert!(Url::parse("../main.css") == Err(ParseError::RelativeUrlWithoutBase))
url/src/lib.rs:103:let this_document = Url::parse("http://servo.[code-host]/rust-url/url/index.html")?;
url/src/lib.rs:266: /// let url = Url::parse("https://example.net")?;
url/src/lib.rs:327: if !self.cannot_be_a_base() {
url/src/lib.rs:366: /// let base = Url::parse("https://example.net/a/b.html")?;
url/src/lib.rs:370: /// let base = Url::parse("https://example.net/a/b/")?;
url/src/lib.rs:401: /// let base = Url::parse("https://example.net/a/b.html")?;
url/src/lib.rs:402: /// let url = Url::parse("https://example.net/a/c.png")?;
url/src/lib.rs:406: /// let base = Url::parse("https://example.net/a/b/")?;
url/src/lib.rs:407: /// let url = Url::parse("https://example.net/a/b/c.png")?;
url/src/lib.rs:411: /// let base = Url::parse("https://example.net/a/b/")?;
url/src/lib.rs:412: /// let url = Url::parse("https://example.net/a/d/c.png")?;
url/src/lib.rs:416: /// let base = Url::parse("https://example.net/a/b.html?c=d")?;
url/src/lib.rs:417: /// let url = Url::parse("https://example.net/a/b.html?e=f")?;
url/src/lib.rs:432: if self.cannot_be_a_base() {
url/src/lib.rs:533: /// let api = Url::parse("https://api.example.com")?;
url/src/lib.rs:561: /// let url = Url::parse(url_str)?;
url/src/lib.rs:584: /// let url = Url::parse(url_str)?;
url/src/lib.rs:602: pub fn check_invariants(&self) -> Result<(), String> {
url/src/lib.rs:700: let other = Url::parse(self.as_str()).expect("Failed to parse myself?");
url/src/lib.rs:733: /// let url = Url::parse("ftp://example.com/foo")?;
url/src/lib.rs:750: /// let url = Url::parse("blob:https://example.com/foo")?;
url/src/lib.rs:767: /// let url = Url::parse("file:///tmp/foo")?;
url/src/lib.rs:770: /// let other_url = Url::parse("file:///tmp/foo")?;
url/src/lib.rs:784: /// let url = Url::parse("foo:bar")?;
url/src/lib.rs:804: /// let url = Url::parse("file:///tmp/foo")?;
url/src/lib.rs:830: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:833: /// let url = Url::parse("unix:/run/foo.socket")?;
url/src/lib.rs:836: /// let url = Url::parse("data:text/plain,Stuff")?;
url/src/lib.rs:866: /// let url = Url::parse("unix:/run/foo.socket")?;
url/src/lib.rs:868: /// let url = Url::parse("file:///tmp/foo")?;
url/src/lib.rs:870: /// let url = Url::parse("https://user:password@example.com/tmp/foo")?;
url/src/lib.rs:872: /// let url = Url::parse("irc://àlex.рф.example.com:6667/foo")?;
url/src/lib.rs:874: /// let url = Url::parse("http://àlex.рф.example.com:80/foo")?;
url/src/lib.rs:902: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:903: /// assert!(!url.cannot_be_a_base());
url/src/lib.rs:905: /// let url = Url::parse("unix:/run/foo.socket")?;
url/src/lib.rs:906: /// assert!(!url.cannot_be_a_base());
url/src/lib.rs:908: /// let url = Url::parse("data:text/plain,Stuff")?;
url/src/lib.rs:909: /// assert!(url.cannot_be_a_base());
url/src/lib.rs:915: pub fn cannot_be_a_base(&self) -> bool {
url/src/lib.rs:929: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:932: /// let url = Url::parse("ftp://:secret123@example.com")?;
url/src/lib.rs:935: /// let url = Url::parse("https://example.com")?;
url/src/lib.rs:959: /// let url = Url::parse("ftp://rms:secret123@example.com")?;
url/src/lib.rs:962: /// let url = Url::parse("ftp://:secret123@example.com")?;
url/src/lib.rs:965: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:968: /// let url = Url::parse("https://example.com")?;
url/src/lib.rs:997: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:1000: /// let url = Url::parse("unix:/run/foo.socket")?;
url/src/lib.rs:1003: /// let url = Url::parse("data:text/plain,Stuff")?;
url/src/lib.rs:1031: /// let url = Url::parse("https://127.0.0.1/index.html")?;
url/src/lib.rs:1034: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:1037: /// let url = Url::parse("unix:/run/foo.socket")?;
url/src/lib.rs:1040: /// let url = Url::parse("data:text/plain,Stuff")?;
url/src/lib.rs:1070: /// let url = Url::parse("https://127.0.0.1/index.html")?;
url/src/lib.rs:1073: /// let url = Url::parse("ftp://rms@example.com")?;
url/src/lib.rs:1076: /// let url = Url::parse("unix:/run/foo.socket")?;
url/src/lib.rs:1079: /// let url = Url::parse("data:text/plain,Stuff")?;
url/src/lib.rs:1105: /// let url = Url::parse("https://127.0.0.1/")?;
url/src/lib.rs:1108: /// let url = Url::parse("mailto:rms@example.net")?;
url/src/lib.rs:1111: /// let url = Url::parse("https://example.com/")?;
url/src/lib.rs:1136: /// let url = Url::parse("https://example.com")?;
url/src/lib.rs:1139: /// let url = Url::parse("https://example.com:443/")?;
url/src/lib.rs:1142: /// let url = Url::parse("ssh://example.com:22")?;
url/src/lib.rs:1168: /// let url = Url::parse("foo://example.com")?;
url/src/lib.rs:1171: /// let url = Url::parse("foo://example.com:1456")?;
url/src/lib.rs:1174: /// let url = Url::parse("https://example.com")?;
url/src/lib.rs:1197: /// let url = url::Url::parse("https://example.net/").unwrap();
url/src/lib.rs:1251: /// let url = Url::parse("https://example.com/api/versions?page=2")?;
url/src/lib.rs:1254: /// let url = Url::parse("https://example.com")?;
url/src/lib.rs:1257: /// let url = Url::parse("https://example.com/countries/việt nam")?;
url/src/lib.rs:1288: /// let url = Url::parse("https://example.com/foo/bar")?;
url/src/lib.rs:1294: /// let url = Url::parse("https://example.com")?;
url/src/lib.rs:1299: /// let url = Url::parse("data:text/plain,HelloWorld")?;
url/src/lib.rs:1302: /// let url = Url::parse("https://example.com/countries/việt nam")?;
url/src/lib.rs:1324: /// let url = Url::parse("https://example.com/products?page=2")?;
url/src/lib.rs:1328: /// let url = Url::parse("https://example.com/products")?;
url/src/lib.rs:1332: /// let url = Url::parse("https://example.com/?country=español")?;
url/src/lib.rs:1365: /// let url = Url::parse("https://example.com/products?page=2&sort=desc")?;
url/src/lib.rs:1403: /// let url = Url::parse("https://example.com/data.csv#row=4")?;
url/src/lib.rs:1407: /// let url = Url::parse("https://example.com/data.csv#cell=4,1-6,2")?;
url/src/lib.rs:1437: /// let mut url = Url::parse("https://example.com/data.csv")?;
url/src/lib.rs:1495: /// let mut url = Url::parse("https://example.com/products")?;
url/src/lib.rs:1544: /// let mut url = Url::parse("https://example.net?lang=fr#nav")?;
url/src/lib.rs:1607: /// let mut url = Url::parse("https://example.com")?;
url/src/lib.rs:1612: /// let mut url = Url::parse("https://example.com/api")?;
url/src/lib.rs:1618: /// let mut url = Url::parse("https://example.com")?;
url/src/lib.rs:1624: /// let mut url = Url::parse("https://example.com")?;
url/src/lib.rs:1636: let cannot_be_a_base = self.cannot_be_a_base();
url/src/lib.rs:1640: if cannot_be_a_base {
url/src/lib.rs:1645: parser.parse_cannot_be_a_base_path(parser::Input::new(path));
url/src/lib.rs:1659: if self.cannot_be_a_base() {
url/src/lib.rs:1695: /// let mut url = Url::parse("ssh://example.net:2048/")?;
url/src/lib.rs:1714: /// let mut url = Url::parse("https://example.org/")?;
url/src/lib.rs:1730: /// let mut url = Url::parse("mailto:rms@example.net")?;
url/src/lib.rs:1743: // has_host implies !cannot_be_a_base
url/src/lib.rs:1807: /// let mut url = Url::parse("https://example.net")?;
url/src/lib.rs:1823: /// let mut url = Url::parse("foo://example.net")?;
url/src/lib.rs:1839: /// let mut url = Url::parse("https://example.net")?;
url/src/lib.rs:1855: /// let mut url = Url::parse("mailto:rms@example.net")?;
url/src/lib.rs:1876: if self.cannot_be_a_base() {
url/src/lib.rs:1994: /// let mut url = Url::parse("http://example.com")?;
url/src/lib.rs:2009: /// let mut url = Url::parse("mailto:rms@example.com")?;
url/src/lib.rs:2021: if self.cannot_be_a_base() {
url/src/lib.rs:2043: /// let mut url = Url::parse("mailto:rmz@example.com")?;
url/src/lib.rs:2047: /// let mut url = Url::parse("ftp://user1:secret1@example.com")?;
url/src/lib.rs:2051: /// let mut url = Url::parse("ftp://user2:@example.com")?;
url/src/lib.rs:2061: // has_host implies !cannot_be_a_base
url/src/lib.rs:2128: /// let mut url = Url::parse("mailto:rmz@example.com")?;
url/src/lib.rs:2143: /// let mut url = Url::parse("ftp://:secre1@example.com/")?;
url/src/lib.rs:2154: // has_host implies !cannot_be_a_base
url/src/lib.rs:2229: /// let mut url = Url::parse("https://example.net")?;
url/src/lib.rs:2244: /// let mut url = Url::parse("foo://example.net")?;
url/src/lib.rs:2260: /// let mut url = Url::parse("https://example.net")?;
url/src/lib.rs:2276: /// let mut url = Url::parse("mailto:rms@example.net")?;
url/src/lib.rs:2291: /// let mut url = Url::parse("foo://example.net")?;
url/src/lib.rs:2306: /// let mut url = Url::parse("http://example.net")?;
url/src/lib.rs:2520: url.check_invariants().map_err(|reason| {
url/src/lib.rs:2537: /// # let url = Url::parse("file:///etc/passwd").unwrap();
url/src/lib.rs:2586: Url::parse(input)
url/src/lib.rs:2594: Url::parse(s)
url/src/lib.rs:2620: .field("cannot_be_a_base", &self.cannot_be_a_base())
url/src/lib.rs:2740: Url::parse(s).map_err(|err| {
url/src/path_segments.rs:25:/// let mut url = Url::parse("mailto:me@example.com")?;
url/src/path_segments.rs:28:/// let mut url = Url::parse("http://example.net/foo/index.html")?;
url/src/path_segments.rs:84: /// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
url/src/path_segments.rs:112: /// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
url/src/path_segments.rs:117: /// let mut url = Url::parse("https://[code-host]/servo/rust-url/")?;
url/src/path_segments.rs:187: /// let mut url = Url::parse("https://[code-host]/")?;
url/src/path_segments.rs:207: /// let mut url = Url::parse("https://[code-host]/servo")?;
url/src/parser.rs:372: } else if base_url.cannot_be_a_base() {
url/src/parser.rs:439: debug_assert!(!base_url.cannot_be_a_base());
url/src/parser.rs:454: SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end),
url/src/parser.rs:459: fn parse_non_special(
url/src/parser.rs:481: self.parse_cannot_be_a_base_path(input)
url/src/parser.rs:1330: pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
url/tests/debugger_visualizer.rs:14: dx url_with_non_special_scheme
url/tests/debugger_visualizer.rs:34: url_with_non_special_scheme : "non-special://test/x" [Type: url::Url]
url/tests/debugger_visualizer.rs:76: let base_url = Url::parse("http://example.org/foo/bar").unwrap();
url/tests/debugger_visualizer.rs:79: let url_with_non_special_scheme = Url::parse("non-special://:@test/x").unwrap();
url/tests/debugger_visualizer.rs:80: assert_eq!(url_with_non_special_scheme.as_str(), "non-special://test/x");
url/tests/debugger_visualizer.rs:83: Url::parse("http://user:pass@foo:21/bar;par?b#c").unwrap();
url/tests/debugger_visualizer.rs:89: let url_blob = Url::parse("blob:https://example.com:443/").unwrap();
url/tests/unit.rs:135: assert!(Url::parse("file:///C:/foo/ba%80r")
url/tests/unit.rs:145: let url = Url::parse("file:///C%3A/foo/bar").unwrap();
url/tests/unit.rs:265: assert_eq!(Url::parse(input).unwrap().host(), Some(host));
url/tests/unit.rs:292: assert!(Url::parse("http://1.35.+33.49").is_err());
url/tests/unit.rs:293: assert!(Url::parse("http://2..2.3").is_err());
url/tests/unit.rs:294: assert!(Url::parse("http://42.0x1232131").is_err());
url/tests/unit.rs:295: assert!(Url::parse("http://192.168.0.257").is_err());
url/tests/unit.rs:309: Url::parse("http://[0::2]").unwrap().host_str(),
url/tests/unit.rs:313: Url::parse("http://[0::ffff:0:2]").unwrap().host_str(),
url/tests/unit.rs:322: Url::parse("http://☃.net/").unwrap().host(),
url/tests/unit.rs:352: let url = Url::parse(input).unwrap();
url/tests/unit.rs:398: let mut url = Url::parse("http://mozilla.org").unwrap();
url/tests/unit.rs:402: url.check_invariants().unwrap();
url/tests/unit.rs:410: url.check_invariants().unwrap();
url/tests/unit.rs:413: Url::parse("file:///").expect("Failed to parse path + protocol")
url/tests/unit.rs:422: Url::parse("mailto:").unwrap().cannot_be_a_base();
url/tests/unit.rs:429: url.check_invariants().unwrap();
url/tests/unit.rs:431: url.check_invariants().unwrap();
url/tests/unit.rs:441: url.check_invariants().unwrap();
url/tests/unit.rs:447: url.check_invariants().unwrap();
url/tests/unit.rs:458: url.check_invariants().unwrap();
url/tests/unit.rs:460: url.check_invariants().unwrap();
url/tests/unit.rs:467: let mut url = Url::parse("https://example.net/hello").unwrap();
url/tests/unit.rs:475: let mut url = Url::parse("foobar://example.net/hello").unwrap();
url/tests/unit.rs:479: let mut url = Url::parse("foo://ș").unwrap();
url/tests/unit.rs:492: assert_eq!(Url::parse("file://./foo").unwrap().domain(), Some("."));
url/tests/unit.rs:507: let origin = &Url::parse("http://example.net/").unwrap().origin();
url/tests/unit.rs:510: Url::parse("http://example.net:80/").unwrap().origin(),
url/tests/unit.rs:511: Url::parse("http://example.net:81/").unwrap().origin(),
url/tests/unit.rs:512: Url::parse("http://example.net").unwrap().origin(),
url/tests/unit.rs:513: Url::parse("http://example.net/hello").unwrap().origin(),
url/tests/unit.rs:514: Url::parse("https://example.net").unwrap().origin(),
url/tests/unit.rs:515: Url::parse("ftp://example.net").unwrap().origin(),
url/tests/unit.rs:516: Url::parse("file://example.net").unwrap().origin(),
url/tests/unit.rs:517: Url::parse("http://user@example.net/").unwrap().origin(),
url/tests/unit.rs:518: Url::parse("http://user:pass@example.net/")
url/tests/unit.rs:531: let opaque_origin = Url::parse("file://example.net").unwrap().origin();
url/tests/unit.rs:532: let same_opaque_origin = Url::parse("file://example.net").unwrap().origin();
url/tests/unit.rs:533: let other_opaque_origin = Url::parse("file://other").unwrap().origin();
url/tests/unit.rs:541: let origin = &Url::parse("http://example.net/").unwrap().origin();
url/tests/unit.rs:542: let blob_origin = &Url::parse("blob:http://example.net/").unwrap().origin();
url/tests/unit.rs:550: assert!(!&Url::parse("blob:malformed//").unwrap().origin().is_tuple())
url/tests/unit.rs:562: let origin = Url::parse(unicode_url).unwrap().origin();
url/tests/unit.rs:567: Url::parse("http://example.net/").unwrap().origin(),
url/tests/unit.rs:568: Url::parse("http://example.net:80/").unwrap().origin(),
url/tests/unit.rs:569: Url::parse("http://example.net:81/").unwrap().origin(),
url/tests/unit.rs:570: Url::parse("http://example.net").unwrap().origin(),
url/tests/unit.rs:571: Url::parse("http://example.net/hello").unwrap().origin(),
url/tests/unit.rs:572: Url::parse("https://example.net").unwrap().origin(),
url/tests/unit.rs:573: Url::parse("ftp://example.net").unwrap().origin(),
url/tests/unit.rs:574: Url::parse("file://example.net").unwrap().origin(),
url/tests/unit.rs:575: Url::parse("http://user@example.net/").unwrap().origin(),
url/tests/unit.rs:576: Url::parse("http://user:pass@example.net/")
url/tests/unit.rs:579: Url::parse("http://127.0.0.1").unwrap().origin(),
url/tests/unit.rs:609: let url = url::Url::parse(url_string).unwrap();
url/tests/unit.rs:625: let mut no_base_url = Url::parse("mailto:test@example.net").unwrap();
url/tests/unit.rs:627: assert!(no_base_url.cannot_be_a_base());
url/tests/unit.rs:641: let url = Url::parse("https://127.0.0.1/").unwrap();
url/tests/unit.rs:644: let url = Url::parse("mailto:test@example.net").unwrap();
url/tests/unit.rs:647: let url = Url::parse("https://example.com/").unwrap();
url/tests/unit.rs:653: let url = Url::parse("https://example.com/products?page=2#fragment").unwrap();
url/tests/unit.rs:660: let url = Url::parse("https://example.com/products").unwrap();
url/tests/unit.rs:664: let url = Url::parse("https://example.com/?country=español").unwrap();
url/tests/unit.rs:671: let url = Url::parse("https://example.com/products?page=2&sort=desc").unwrap();
url/tests/unit.rs:687: let url = Url::parse("https://example.com/#fragment").unwrap();
url/tests/unit.rs:690: let url = Url::parse("https://example.com/").unwrap();
url/tests/unit.rs:696: let mut url = Url::parse("http://example.com").unwrap();
url/tests/unit.rs:709: let mut url = Url::parse("https://existing.url").unwrap();
url/tests/unit.rs:720: Url::parse("https://user:pass@domain.com:9742/path/file.ext?key=val&key2=val2#fragment")
url/tests/unit.rs:748: let url = Url::parse("https://example.com/path/file.ext?key=val&key2=val2#fragment").unwrap();
url/tests/unit.rs:908:fn test_non_special_path() {
url/tests/unit.rs:909: let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
url/tests/unit.rs:917:fn test_non_special_path2() {
url/tests/unit.rs:918: let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
url/tests/unit.rs:932:fn test_non_special_path3() {
url/tests/unit.rs:933: let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
url/tests/unit.rs:953: let mut url = Url::parse("arhttpsps:/.//eom/dae.com/\\\\t\\:").unwrap();
url/tests/unit.rs:959: let mut url = Url::parse("m://").unwrap();
url/tests/unit.rs:1020: let url = Url::parse(expected_slices.full).unwrap();
url/tests/unit.rs:1144: let base_uri = url::Url::parse(base).unwrap();
url/tests/unit.rs:1145: let relative_uri = url::Url::parse(uri).unwrap();
url/tests/unit.rs:1170: let base_uri = url::Url::parse(base).unwrap();
url/tests/unit.rs:1171: let relative_uri = url::Url::parse(uri).unwrap();
url/tests/unit.rs:1179: let url = Url::parse("mailto:joe@example.com").unwrap();
url/tests/unit.rs:1181: let url = Url::parse("unix:/run/foo.socket").unwrap();
url/tests/unit.rs:1183: let url = Url::parse("file:///tmp/foo").unwrap();
url/tests/unit.rs:1185: let url = Url::parse("http://example.com/tmp/foo").unwrap();
url/tests/unit.rs:1191: let url = Url::parse("mailto:joe@example.com").unwrap();
url/tests/unit.rs:1193: let url = Url::parse("unix:/run/foo.socket").unwrap();
url/tests/unit.rs:1195: let url = Url::parse("file:///tmp/foo").unwrap();
url/tests/unit.rs:1197: let url = Url::parse("http://example.com/tmp/foo").unwrap();
url/tests/unit.rs:1199: let url = Url::parse("ftp://127.0.0.1:21/").unwrap();
url/tests/unit.rs:1201: let url = Url::parse("ftp://user@127.0.0.1:2121/").unwrap();
url/tests/unit.rs:1203: let url = Url::parse("https://:@example.com/").unwrap();
url/tests/unit.rs:1205: let url = Url::parse("https://:password@[::1]:8080/").unwrap();
url/tests/unit.rs:1207: let url = Url::parse("gopher://user:@àlex.example.com:70").unwrap();
url/tests/unit.rs:1209: let url = Url::parse("irc://àlex:àlex@àlex.рф.example.com:6667/foo").unwrap();
url/tests/unit.rs:1214: let url = Url::parse("https://àlex:àlex@àlex.рф.example.com:443/foo").unwrap();
sed -n '880,980p' url/tests/unit.rs
Chunk ID: 074a20
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 759
Output:
/// https://[code-host]/servo/rust-url/issues/505
#[cfg(windows)]
#[test]
fn test_url_from_file_path() {
use std::path::PathBuf;
use url::Url;
let p = PathBuf::from("c:///");
let u = Url::from_file_path(p).unwrap();
let path = u.to_file_path().unwrap();
assert_eq!("C:\\", path.to_str().unwrap());
}
/// https://[code-host]/servo/rust-url/issues/505
#[cfg(not(windows))]
#[test]
fn test_url_from_file_path() {
use std::path::PathBuf;
use url::Url;
let p = PathBuf::from("/c:/");
let u = Url::from_file_path(p).unwrap();
let path = u.to_file_path().unwrap();
assert_eq!("/c:/", path.to_str().unwrap());
}
#[test]
fn test_non_special_path() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("diesel_foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/diesel_foo");
assert_eq!(db_url.path(), "/diesel_foo");
}
#[test]
fn test_non_special_path2() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("");
assert_eq!(db_url.path(), "");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost");
db_url.set_path("foo");
assert_eq!(db_url.path(), "/foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
db_url.set_path("/bar");
assert_eq!(db_url.path(), "/bar");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/bar");
}
#[test]
fn test_non_special_path3() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("/");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
assert_eq!(db_url.path(), "/");
db_url.set_path("/foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
assert_eq!(db_url.path(), "/foo");
}
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");
assert_eq!(url.to_string(), "http://localhost:6767/foo/bar");
assert_eq!(result, Err(()));
}
#[test]
fn no_panic() {
let mut url = Url::parse("arhttpsps:/.//eom/dae.com/\\\\t\\:").unwrap();
url::quirks::set_hostname(&mut url, "//eom/datcom/\\\\t\\://eom/data.cs").unwrap();
}
#[test]
fn pop_if_empty_in_bounds() {
let mut url = Url::parse("m://").unwrap();
let mut segments = url.path_segments_mut().unwrap();
segments.pop_if_empty();
segments.pop();
}
#[test]
fn test_slicing() {
use url::Position::*;
#[derive(Default)]
struct ExpectedSlices<'a> {
full: &'a str,
scheme: &'a str,
username: &'a str,
password: &'a str,
host: &'a str,
port: &'a str,
path: &'a str,
query: &'a str,
fragment: &'a str,
}
sed -n '1000,1065p' url/tests/unit.rs
Chunk ID: 424ce0
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 501
Output:
fragment: "fragment",
..Default::default()
},
ExpectedSlices {
full: "https://domain.com:9742/path/file.ext",
scheme: "https",
host: "domain.com",
port: "9742",
path: "/path/file.ext",
..Default::default()
},
ExpectedSlices {
full: "blob:blob-info",
scheme: "blob",
path: "blob-info",
..Default::default()
},
];
for expected_slices in &data {
let url = Url::parse(expected_slices.full).unwrap();
assert_eq!(&url[..], expected_slices.full);
assert_eq!(&url[BeforeScheme..AfterScheme], expected_slices.scheme);
assert_eq!(
&url[BeforeUsername..AfterUsername],
expected_slices.username
);
assert_eq!(
&url[BeforePassword..AfterPassword],
expected_slices.password
);
assert_eq!(&url[BeforeHost..AfterHost], expected_slices.host);
assert_eq!(&url[BeforePort..AfterPort], expected_slices.port);
assert_eq!(&url[BeforePath..AfterPath], expected_slices.path);
assert_eq!(&url[BeforeQuery..AfterQuery], expected_slices.query);
assert_eq!(
&url[BeforeFragment..AfterFragment],
expected_slices.fragment
);
assert_eq!(&url[..AfterFragment], expected_slices.full);
}
}
#[test]
fn test_make_relative() {
let tests = [
(
"http://127.0.0.1:8080/test",
"http://127.0.0.1:8080/test",
"",
),
(
"http://127.0.0.1:8080/test",
"http://127.0.0.1:8080/test/",
"test/",
),
(
"http://127.0.0.1:8080/test/",
"http://127.0.0.1:8080/test",
"../test",
),
(
"http://127.0.0.1:8080/",
"http://127.0.0.1:8080/?foo=bar#123",
"?foo=bar#123",
),
sed -n '420,500p' url/tests/data.rs
Chunk ID: a02010 Wall time: 0.0000 seconds Process exited with code 0 Original token count: 0 Output:
rg -n "fn as_str|impl fmt::Display|serialization\(|slice\(|byte_at|mutate" url/src/lib.rs url/src/parser.rs
Chunk ID: 7e575a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1394
Output:
url/src/parser.rs:63: impl fmt::Display for ParseError {
url/src/parser.rs:139:impl fmt::Display for SyntaxViolation {
url/src/parser.rs:622: (Some(i), _) | (None, Some(i)) => base_url.slice(..i),
url/src/parser.rs:639: (Some(i), _) | (None, Some(i)) => base_url.slice(..i),
url/src/parser.rs:734: (Some(i), _) | (None, Some(i)) => base_url.slice(..i),
url/src/parser.rs:758: debug_assert!(base_url.byte_at(scheme_end) == b':');
url/src/parser.rs:760: .push_str(base_url.slice(..scheme_end + 1));
url/src/parser.rs:767: self.serialization.push_str(base_url.slice(..path_start));
url/src/parser.rs:790: (Some(i), _) | (None, Some(i)) => base_url.slice(..i),
url/src/parser.rs:1445: Some(i) => base_url.slice(..i),
url/src/lib.rs:568: pub fn as_str(&self) -> &str {
url/src/lib.rs:630: assert!(self.byte_at(0).is_ascii_alphabetic());
url/src/lib.rs:632: .slice(1..self.scheme_end)
url/src/lib.rs:635: assert_eq!(self.byte_at(self.scheme_end), b':');
url/src/lib.rs:637: if self.slice(self.scheme_end + 1..).starts_with("//") {
url/src/lib.rs:640: match self.byte_at(self.username_end) {
url/src/lib.rs:643: assert_eq!(self.byte_at(self.host_start - 1), b'@');
url/src/lib.rs:651: let host_str = self.slice(self.host_start..self.host_end);
url/src/lib.rs:668: assert_eq!(self.byte_at(self.host_end), b':');
url/src/lib.rs:669: let port_str = self.slice(self.host_end + 1..self.path_start);
url/src/lib.rs:677: || matches!(self.byte_at(self.path_start), b'/' | b'#' | b'?')
url/src/lib.rs:690: assert_eq!(self.byte_at(start), b'?');
url/src/lib.rs:694: assert_eq!(self.byte_at(start), b'#');
url/src/lib.rs:812: self.slice(..self.scheme_end)
url/src/lib.rs:844: debug_assert!(self.byte_at(self.scheme_end) == b':');
url/src/lib.rs:845: self.slice(self.scheme_end..).starts_with("://")
url/src/lib.rs:883: self.slice(self.scheme_end + scheme_separator_len..self.path_start)
url/src/lib.rs:916: !self.slice(self.scheme_end + 1..).starts_with('/')
url/src/lib.rs:944: self.slice(self.scheme_end + scheme_separator_len..self.username_end)
url/src/lib.rs:979: && self.byte_at(self.username_end) == b':'
url/src/lib.rs:981: debug_assert!(self.byte_at(self.host_start - 1) == b'@');
url/src/lib.rs:982: Some(self.slice(self.username_end + 1..self.host_start - 1))
url/src/lib.rs:1048: Some(self.slice(self.host_start..self.host_end))
url/src/lib.rs:1088: HostInternal::Domain => Some(Host::Domain(self.slice(self.host_start..self.host_end))),
url/src/lib.rs:1119: HostInternal::Domain => Some(self.slice(self.host_start..self.host_end)),
url/src/lib.rs:1265: (None, None) => self.slice(self.path_start..),
url/src/lib.rs:1267: self.slice(self.path_start..next_component_start)
url/src/lib.rs:1343: debug_assert!(self.byte_at(query_start) == b'?');
url/src/lib.rs:1344: Some(self.slice(query_start + 1..))
url/src/lib.rs:1347: debug_assert!(self.byte_at(query_start) == b'?');
url/src/lib.rs:1348: Some(self.slice(query_start + 1..fragment_start))
url/src/lib.rs:1416: debug_assert!(self.byte_at(start) == b'#');
url/src/lib.rs:1417: self.slice(start + 1..)
url/src/lib.rs:1421: fn mutate<F: FnOnce(&mut Parser<'_>) -> R, R>(&mut self, f: F) -> R {
url/src/lib.rs:1454: debug_assert!(self.byte_at(start) == b'#');
url/src/lib.rs:1461: self.mutate(|parser| parser.parse_fragment(parser::Input::no_trim(input)))
url/src/lib.rs:1470: debug_assert!(self.byte_at(start) == b'#');
url/src/lib.rs:1471: let fragment = self.slice(start + 1..).to_owned();
url/src/lib.rs:1510: debug_assert!(self.byte_at(start) == b'?');
url/src/lib.rs:1519: self.mutate(|parser| {
url/src/lib.rs:1572: debug_assert!(self.byte_at(start) == b'?');
url/src/lib.rs:1590: let after_path = self.slice(i..).to_owned();
url/src/lib.rs:1639: self.mutate(|parser| {
url/src/lib.rs:1771: let path_and_after = self.slice(self.path_start..).to_owned();
url/src/lib.rs:1912: debug_assert!(self.byte_at(self.scheme_end) == b':');
url/src/lib.rs:1913: debug_assert!(self.byte_at(self.path_start) == b'/');
url/src/lib.rs:1946: let suffix = self.slice(old_suffix_pos..).to_owned();
url/src/lib.rs:1949: debug_assert!(self.slice(self.scheme_end..self.host_start) == ":");
url/src/lib.rs:2066: let host_and_after = self.slice(self.host_start..).to_owned();
url/src/lib.rs:2090: } else if self.byte_at(self.username_end) == b':' {
url/src/lib.rs:2092: let has_username_or_password = self.byte_at(self.host_start - 1) == b'@';
url/src/lib.rs:2159: debug_assert!(self.slice(self.scheme_end..username_start) == "://");
url/src/lib.rs:2160: if self.slice(username_start..self.username_end) == username {
url/src/lib.rs:2163: let after_username = self.slice(self.username_end..).to_owned();
url/src/lib.rs:2353: parser.serialization.push_str(self.slice(old_scheme_end..));
url/src/lib.rs:2575: fn byte_at(&self, i: u32) -> u8 {
url/src/lib.rs:2599:impl fmt::Display for Url {
sed -n '540,585p' url/src/lib.rs
Chunk ID: 62dd16
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 301
Output:
/// ```
pub fn options<'a>() -> ParseOptions<'a> {
ParseOptions {
base_url: None,
encoding_override: None,
violation_fn: None,
}
}
/// Return the serialization of this URL.
///
/// This is fast since that serialization is already stored in the `Url` struct.
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url_str = "https://example.net/";
/// let url = Url::parse(url_str)?;
/// assert_eq!(url.as_str(), url_str);
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
#[inline]
pub fn as_str(&self) -> &str {
&self.serialization
}
/// Return the serialization of this URL.
///
/// This consumes the `Url` and takes ownership of the `String` stored in it.
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let url_str = "https://example.net/";
/// let url = Url::parse(url_str)?;
/// assert_eq!(String::from(url), url_str);
sed -n '1410,1535p' url/src/lib.rs
Chunk ID: a63911
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1101
Output:
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn fragment(&self) -> Option<&str> {
self.fragment_start.map(|start| {
debug_assert!(self.byte_at(start) == b'#');
self.slice(start + 1..)
})
}
fn mutate<F: FnOnce(&mut Parser<'_>) -> R, R>(&mut self, f: F) -> R {
let mut parser = Parser::for_setter(mem::take(&mut self.serialization));
let result = f(&mut parser);
self.serialization = parser.serialization;
result
}
/// Change this URL’s fragment identifier.
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.com/data.csv")?;
/// assert_eq!(url.as_str(), "https://example.com/data.csv");
/// url.set_fragment(Some("cell=4,1-6,2"));
/// assert_eq!(url.as_str(), "https://example.com/data.csv#cell=4,1-6,2");
/// assert_eq!(url.fragment(), Some("cell=4,1-6,2"));
///
/// url.set_fragment(None);
/// assert_eq!(url.as_str(), "https://example.com/data.csv");
/// assert!(url.fragment().is_none());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn set_fragment(&mut self, fragment: Option<&str>) {
// Remove any previous fragment
if let Some(start) = self.fragment_start {
debug_assert!(self.byte_at(start) == b'#');
self.serialization.truncate(start as usize);
}
// Write the new one
if let Some(input) = fragment {
self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
self.serialization.push('#');
self.mutate(|parser| parser.parse_fragment(parser::Input::no_trim(input)))
} else {
self.fragment_start = None;
self.strip_trailing_spaces_from_opaque_path();
}
}
fn take_fragment(&mut self) -> Option<String> {
self.fragment_start.take().map(|start| {
debug_assert!(self.byte_at(start) == b'#');
let fragment = self.slice(start + 1..).to_owned();
self.serialization.truncate(start as usize);
fragment
})
}
fn restore_already_parsed_fragment(&mut self, fragment: Option<String>) {
if let Some(ref fragment) = fragment {
assert!(self.fragment_start.is_none());
self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
self.serialization.push('#');
self.serialization.push_str(fragment);
}
}
/// Change this URL’s query string.
///
/// # Examples
///
/// ```rust
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.com/products")?;
/// assert_eq!(url.as_str(), "https://example.com/products");
///
/// url.set_query(Some("page=2"));
/// assert_eq!(url.as_str(), "https://example.com/products?page=2");
/// assert_eq!(url.query(), Some("page=2"));
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
pub fn set_query(&mut self, query: Option<&str>) {
let fragment = self.take_fragment();
// Remove any previous query
if let Some(start) = self.query_start.take() {
debug_assert!(self.byte_at(start) == b'?');
self.serialization.truncate(start as usize);
}
// Write the new query, if any
if let Some(input) = query {
self.query_start = Some(to_u32(self.serialization.len()).unwrap());
self.serialization.push('?');
let scheme_type = SchemeType::from(self.scheme());
let scheme_end = self.scheme_end;
self.mutate(|parser| {
let vfn = parser.violation_fn;
parser.parse_query(
scheme_type,
scheme_end,
parser::Input::trim_tab_and_newlines(input, vfn),
)
});
} else {
self.query_start = None;
self.strip_trailing_spaces_from_opaque_path();
}
self.restore_already_parsed_fragment(fragment);
}
/// Manipulate this URL’s query string, viewed as a sequence of name/value pairs
sed -n '1760,1965p' url/src/lib.rs
Chunk ID: 2a0943
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1870
Output:
let offset = self.path_start - self.host_end;
self.path_start = self.host_end;
if let Some(ref mut index) = self.query_start {
*index -= offset
}
if let Some(ref mut index) = self.fragment_start {
*index -= offset
}
}
(Some(old), Some(new)) if old == new => {}
(_, Some(new)) => {
let path_and_after = self.slice(self.path_start..).to_owned();
self.serialization.truncate(self.host_end as usize);
write!(&mut self.serialization, ":{}", new).unwrap();
let old_path_start = self.path_start;
let new_path_start = to_u32(self.serialization.len()).unwrap();
self.path_start = new_path_start;
let adjust = |index: &mut u32| {
*index -= old_path_start;
*index += new_path_start;
};
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
self.serialization.push_str(&path_and_after);
}
}
self.port = port;
}
/// Change this URL’s host.
///
/// Removing the host (calling this with `None`)
/// will also remove any username, password, and port number.
///
/// # Examples
///
/// Change host:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.net")?;
/// let result = url.set_host(Some("rust-lang.org"));
/// assert!(result.is_ok());
/// assert_eq!(url.as_str(), "https://rust-lang.org/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Remove host:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("foo://example.net")?;
/// let result = url.set_host(None);
/// assert!(result.is_ok());
/// assert_eq!(url.as_str(), "foo:/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot remove host for 'special' schemes (e.g. `http`):
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("https://example.net")?;
/// let result = url.set_host(None);
/// assert!(result.is_err());
/// assert_eq!(url.as_str(), "https://example.net/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot change or remove host for cannot-be-a-base URLs:
///
/// ```
/// use url::Url;
/// # use url::ParseError;
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rms@example.net")?;
///
/// let result = url.set_host(Some("rust-lang.org"));
/// assert!(result.is_err());
/// assert_eq!(url.as_str(), "mailto:rms@example.net");
///
/// let result = url.set_host(None);
/// assert!(result.is_err());
/// assert_eq!(url.as_str(), "mailto:rms@example.net");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// # Errors
///
/// If this URL is cannot-be-a-base or there is an error parsing the given `host`,
/// a [`ParseError`] variant will be returned.
///
/// [`ParseError`]: enum.ParseError.html
pub fn set_host(&mut self, host: Option<&str>) -> Result<(), ParseError> {
if self.cannot_be_a_base() {
return Err(ParseError::SetHostOnCannotBeABaseUrl);
}
let scheme_type = SchemeType::from(self.scheme());
if let Some(host) = host {
if host.is_empty() && scheme_type.is_special() && !scheme_type.is_file() {
return Err(ParseError::EmptyHost);
}
let mut host_substr = host;
// Otherwise, if c is U+003A (:) and the [] flag is unset, then
if !host.starts_with('[') || !host.ends_with(']') {
match host.find(':') {
Some(0) => {
// If buffer is the empty string, validation error, return failure.
return Err(ParseError::InvalidDomainCharacter);
}
// Let host be the result of host parsing buffer
Some(colon_index) => {
host_substr = &host[..colon_index];
}
None => {}
}
}
if SchemeType::from(self.scheme()).is_special() {
self.set_host_internal(Host::parse(host_substr)?, None);
} else {
self.set_host_internal(Host::parse_opaque(host_substr)?, None);
}
} else if self.has_host() {
if scheme_type.is_special() && !scheme_type.is_file() {
return Err(ParseError::EmptyHost);
} else if self.serialization.len() == self.path_start as usize {
self.serialization.push('/');
}
debug_assert!(self.byte_at(self.scheme_end) == b':');
debug_assert!(self.byte_at(self.path_start) == b'/');
let new_path_start = if scheme_type.is_file() {
self.scheme_end + 3
} else {
self.scheme_end + 1
};
self.serialization
.drain(new_path_start as usize..self.path_start as usize);
let offset = self.path_start - new_path_start;
self.path_start = new_path_start;
self.username_end = new_path_start;
self.host_start = new_path_start;
self.host_end = new_path_start;
self.port = None;
if let Some(ref mut index) = self.query_start {
*index -= offset
}
if let Some(ref mut index) = self.fragment_start {
*index -= offset
}
}
Ok(())
}
/// opt_new_port: None means leave unchanged, Some(None) means remove any port number.
fn set_host_internal(&mut self, host: Host<String>, opt_new_port: Option<Option<u16>>) {
let old_suffix_pos = if opt_new_port.is_some() {
self.path_start
} else {
self.host_end
};
let suffix = self.slice(old_suffix_pos..).to_owned();
self.serialization.truncate(self.host_start as usize);
if !self.has_authority() {
debug_assert!(self.slice(self.scheme_end..self.host_start) == ":");
debug_assert!(self.username_end == self.host_start);
self.serialization.push('/');
self.serialization.push('/');
self.username_end += 2;
self.host_start += 2;
}
write!(&mut self.serialization, "{}", host).unwrap();
self.host_end = to_u32(self.serialization.len()).unwrap();
self.host = host.into();
if let Some(new_port) = opt_new_port {
self.port = new_port;
if let Some(port) = new_port {
write!(&mut self.serialization, ":{}", port).unwrap();
}
}
sed -n '2560,2610p' url/src/lib.rs
Chunk ID: cc8fa6
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 265
Output:
}
Err(())
}
// Private helper methods:
#[inline]
fn slice<R>(&self, range: R) -> &str
where
R: RangeArg,
{
range.slice_of(&self.serialization)
}
#[inline]
fn byte_at(&self, i: u32) -> u8 {
self.serialization.as_bytes()[i as usize]
}
}
/// Parse a string as an URL, without a base URL or encoding override.
impl str::FromStr for Url {
type Err = ParseError;
#[inline]
fn from_str(input: &str) -> Result<Url, crate::ParseError> {
Url::parse(input)
}
}
impl<'a> TryFrom<&'a str> for Url {
type Error = ParseError;
fn try_from(s: &'a str) -> Result<Self, Self::Error> {
Url::parse(s)
}
}
/// Display the serialization of this URL.
impl fmt::Display for Url {
#[inline]
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.serialization, formatter)
}
}
/// String conversion.
impl From<Url> for String {
fn from(value: Url) -> String {
value.serialization
}
sed -n '1965,2028p' url/src/lib.rs
Chunk ID: b0ee61
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 492
Output:
}
let new_suffix_pos = to_u32(self.serialization.len()).unwrap();
self.serialization.push_str(&suffix);
let adjust = |index: &mut u32| {
*index -= old_suffix_pos;
*index += new_suffix_pos;
};
adjust(&mut self.path_start);
if let Some(ref mut index) = self.query_start {
adjust(index)
}
if let Some(ref mut index) = self.fragment_start {
adjust(index)
}
}
/// Change this URL’s host to the given IP address.
///
/// If this URL is cannot-be-a-base, do nothing and return `Err`.
///
/// Compared to `Url::set_host`, this skips the host parser.
///
/// # Examples
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("http://example.com")?;
/// url.set_ip_host("127.0.0.1".parse().unwrap());
/// assert_eq!(url.host_str(), Some("127.0.0.1"));
/// assert_eq!(url.as_str(), "http://127.0.0.1/");
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
/// Cannot change URL's from mailto(cannot-be-base) to ip:
///
/// ```rust
/// use url::{Url, ParseError};
///
/// # fn run() -> Result<(), ParseError> {
/// let mut url = Url::parse("mailto:rms@example.com")?;
/// let result = url.set_ip_host("127.0.0.1".parse().unwrap());
///
/// assert_eq!(url.as_str(), "mailto:rms@example.com");
/// assert!(result.is_err());
/// # Ok(())
/// # }
/// # run().unwrap();
/// ```
///
#[allow(clippy::result_unit_err)]
pub fn set_ip_host(&mut self, address: IpAddr) -> Result<(), ()> {
if self.cannot_be_a_base() {
return Err(());
}
let address = match address {
IpAddr::V4(address) => Host::Ipv4(address),
IpAddr::V6(address) => Host::Ipv6(address),
};
cargo test -p url no_panic --locked
Chunk ID: 2b0113
Wall time: 2.2768 seconds
Process exited with code 0
Original token count: 710
Output:
Blocking waiting for file lock on package cache
Blocking waiting for file lock on package cache
Compiling proc-macro2 v1.0.106
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling quote v1.0.45
Compiling syn v1.0.109
Compiling debugger_test v0.1.5
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 2.40s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 1 test
test no_panic ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 57 filtered out; finished in 0.00s
cargo test -p url test_slicing --locked
Chunk ID: a08128
Wall time: 2.2580 seconds
Process exited with code 0
Original token count: 685
Output:
Blocking waiting for file lock on package cache
Blocking waiting for file lock on package cache
Blocking waiting for file lock on build directory
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 2.39s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 1 test
test test_slicing ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 57 filtered out; finished in 0.00s
sed -n '1,110p' url/src/parser.rs
Chunk ID: c8782f
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 920
Output:
// Copyright 2013-2016 The rust-url developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::error::Error;
use std::fmt::{self, Formatter, Write};
use std::str;
use crate::host::{Host, HostInternal};
use crate::Url;
use form_urlencoded::EncodingOverride;
use percent_encoding::{percent_encode, utf8_percent_encode, AsciiSet, CONTROLS};
/// https://url.spec.whatwg.org/#fragment-percent-encode-set
const FRAGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'<').add(b'>').add(b'`');
/// https://url.spec.whatwg.org/#path-percent-encode-set
const PATH: &AsciiSet = &FRAGMENT.add(b'#').add(b'?').add(b'{').add(b'}');
/// https://url.spec.whatwg.org/#userinfo-percent-encode-set
pub(crate) const USERINFO: &AsciiSet = &PATH
.add(b'/')
.add(b':')
.add(b';')
.add(b'=')
.add(b'@')
.add(b'[')
.add(b'\\')
.add(b']')
.add(b'^')
.add(b'|');
pub(crate) const PATH_SEGMENT: &AsciiSet = &PATH.add(b'/').add(b'%');
// The backslash (\) character is treated as a path separator in special URLs
// so it needs to be additionally escaped in that case.
pub(crate) const SPECIAL_PATH_SEGMENT: &AsciiSet = &PATH_SEGMENT.add(b'\\');
// https://url.spec.whatwg.org/#query-state
const QUERY: &AsciiSet = &CONTROLS.add(b' ').add(b'"').add(b'#').add(b'<').add(b'>');
const SPECIAL_QUERY: &AsciiSet = &QUERY.add(b'\'');
pub type ParseResult<T> = Result<T, ParseError>;
macro_rules! simple_enum_error {
($($name: ident => $description: expr,)+) => {
/// Errors that can occur during parsing.
///
/// This may be extended in the future so exhaustive matching is
/// discouraged with an unused variant.
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
#[non_exhaustive]
pub enum ParseError {
$(
$name,
)+
}
impl fmt::Display for ParseError {
fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
match *self {
$(
ParseError::$name => fmt.write_str($description),
)+
}
}
}
}
}
impl Error for ParseError {}
simple_enum_error! {
EmptyHost => "empty host",
IdnaError => "invalid international domain name",
InvalidPort => "invalid port number",
InvalidIpv4Address => "invalid IPv4 address",
InvalidIpv6Address => "invalid IPv6 address",
InvalidDomainCharacter => "invalid domain character",
RelativeUrlWithoutBase => "relative URL without a base",
RelativeUrlWithCannotBeABaseBase => "relative URL with a cannot-be-a-base base",
SetHostOnCannotBeABaseUrl => "a cannot-be-a-base URL doesn’t have a host to set",
Overflow => "URLs more than 4 GB are not supported",
}
impl From<::idna::Errors> for ParseError {
fn from(_: ::idna::Errors) -> ParseError {
ParseError::IdnaError
}
}
macro_rules! syntax_violation_enum {
($($name: ident => $description: expr,)+) => {
/// Non-fatal syntax violations that can occur during parsing.
///
/// This may be extended in the future so exhaustive matching is
/// discouraged with an unused variant.
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
#[non_exhaustive]
pub enum SyntaxViolation {
$(
$name,
)+
}
impl SyntaxViolation {
*** Begin Patch
*** Update File: url/src/lib.rs
@@
mod parser;
mod path_segments;
mod slicing;
#[doc(hidden)]
pub mod quirks;
+pub(crate) const PATH_START_MARKER: &str = "/.";
+
/// A parsed URL record.
#[derive(Clone)]
pub struct Url {
@@
fn strip_trailing_spaces_from_opaque_path(&mut self) {
if !self.cannot_be_a_base() {
return;
}
@@
self.serialization.truncate(start);
}
+
+ pub(crate) fn has_path_start_marker(&self) -> bool {
+ !self.has_authority()
+ && !SchemeType::from(self.scheme()).is_special()
+ && self.serialization[self.path_start as usize..].starts_with("/.//")
+ }
+
+ pub(crate) fn logical_path_start(&self) -> u32 {
+ if self.has_path_start_marker() {
+ self.path_start + PATH_START_MARKER.len() as u32
+ } else {
+ self.path_start
+ }
+ }
+
+ fn normalize_path_start_marker(&mut self) {
+ if self.has_authority() || SchemeType::from(self.scheme()).is_special() {
+ return;
+ }
+
+ let has_marker = self.has_path_start_marker();
+ let logical_path_start = if has_marker {
+ self.path_start as usize + PATH_START_MARKER.len()
+ } else {
+ self.path_start as usize
+ };
+ let needs_marker = self.serialization[logical_path_start..].starts_with("//");
+
+ match (has_marker, needs_marker) {
+ (false, true) => {
+ self.serialization
+ .insert_str(self.path_start as usize, PATH_START_MARKER);
+ if let Some(ref mut index) = self.query_start {
+ *index += PATH_START_MARKER.len() as u32;
+ }
+ if let Some(ref mut index) = self.fragment_start {
+ *index += PATH_START_MARKER.len() as u32;
+ }
+ }
+ (true, false) => {
+ self.serialization.drain(
+ self.path_start as usize
+ ..self.path_start as usize + PATH_START_MARKER.len(),
+ );
+ if let Some(ref mut index) = self.query_start {
+ *index -= PATH_START_MARKER.len() as u32;
+ }
+ if let Some(ref mut index) = self.fragment_start {
+ *index -= PATH_START_MARKER.len() as u32;
+ }
+ }
+ _ => {}
+ }
+ }
@@
pub fn path(&self) -> &str {
+ let path_start = self.logical_path_start();
match (self.query_start, self.fragment_start) {
- (None, None) => self.slice(self.path_start..),
+ (None, None) => self.slice(path_start..),
(Some(next_component_start), _) | (None, Some(next_component_start)) => {
- self.slice(self.path_start..next_component_start)
+ self.slice(path_start..next_component_start)
}
}
}
@@
self.mutate(|parser| {
if cannot_be_a_base {
if path.starts_with('/') {
parser.serialization.push_str("%2F");
@@
parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
}
});
+ self.normalize_path_start_marker();
self.restore_after_path(old_after_path_pos, &after_path);
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/lib.rs
*** Begin Patch
*** Update File: url/src/lib.rs
@@
- self.normalize_path_start_marker();
self.restore_after_path(old_after_path_pos, &after_path);
+ self.normalize_path_start_marker();
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/lib.rs
*** Begin Patch
*** Update File: url/src/path_segments.rs
@@
if SchemeType::from(url.scheme()).is_special() {
debug_assert!(url.byte_at(url.path_start) == b'/');
} else {
+ let path_start = url.logical_path_start();
debug_assert!(
- url.serialization.len() == url.path_start as usize
- || url.byte_at(url.path_start) == b'/'
+ url.serialization.len() == path_start as usize || url.byte_at(path_start) == b'/'
);
}
PathSegmentsMut {
- after_first_slash: url.path_start as usize + "/".len(),
+ after_first_slash: url.logical_path_start() as usize + "/".len(),
url,
old_after_path_position,
after_path,
}
}
@@
fn drop(&mut self) {
self.url
- .restore_after_path(self.old_after_path_position, &self.after_path)
+ .restore_after_path(self.old_after_path_position, &self.after_path);
+ self.url.normalize_path_start_marker();
}
}
@@
I: IntoIterator,
I::Item: AsRef<str>,
{
let scheme_type = SchemeType::from(self.url.scheme());
- let path_start = self.url.path_start as usize;
+ let path_start = self.url.logical_path_start() as usize;
self.url.mutate(|parser| {
parser.context = parser::Context::PathSegmentSetter;
for segment in segments {
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/path_segments.rs
*** Begin Patch
*** Update File: url/src/slicing.rs
@@
}
Position::AfterPort => self.path_start as usize,
- Position::BeforePath => self.path_start as usize,
+ Position::BeforePath => self.logical_path_start() as usize,
Position::AfterPath => match (self.query_start, self.fragment_start) {
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/slicing.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
-use crate::Url;
+use crate::{Url, PATH_START_MARKER};
@@
let remaining = if let Some(input) = input.split_prefix('/') {
- let path_start = self.serialization.len();
- self.serialization.push('/');
- self.parse_path(scheme_type, &mut false, path_start, input)
+ if let Some(input) = input.split_prefix(".//") {
+ self.serialization.push_str(PATH_START_MARKER);
+ let logical_path_start = self.serialization.len();
+ self.parse_path(scheme_type, &mut false, logical_path_start, input)
+ } else {
+ let path_start = self.serialization.len();
+ self.serialization.push('/');
+ self.parse_path(scheme_type, &mut false, path_start, input)
+ }
} else {
self.parse_cannot_be_a_base_path(input)
};
@@
)
}
Some('/') | Some('\\') => {
@@
}
let path_start = base_url.path_start;
+ let logical_path_start = base_url.logical_path_start();
self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
- path_start as usize,
+ logical_path_start as usize,
input_after_first_char,
);
self.with_query_and_fragment(
@@
};
self.serialization.push_str(before_query);
// FIXME spec says just "remove last entry", not the "pop" algorithm
- self.pop_path(scheme_type, base_url.path_start as usize);
+ let logical_path_start = base_url.logical_path_start();
+ self.pop_path(scheme_type, logical_path_start as usize);
// A special url always has a path.
// A path always starts with '/'
- if self.serialization.len() == base_url.path_start as usize
+ if self.serialization.len() == logical_path_start as usize
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
- base_url.path_start as usize,
+ logical_path_start as usize,
remaining,
),
_ => {
- self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
+ self.parse_path(scheme_type, &mut true, logical_path_start as usize, input)
}
};
*** End Patch
apply_patch verification failed: Failed to find expected lines in /app/url/src/parser.rs:
)
}
Some('/') | Some('\\') => {sed -n '8,18p' url/src/parser.rs
Chunk ID: 15b0c1
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 79
Output:
use std::error::Error;
use std::fmt::{self, Formatter, Write};
use std::str;
use crate::host::{Host, HostInternal};
use crate::Url;
use form_urlencoded::EncodingOverride;
use percent_encoding::{percent_encode, utf8_percent_encode, AsciiSet, CONTROLS};
/// https://url.spec.whatwg.org/#fragment-percent-encode-set
sed -n '466,486p' url/src/parser.rs
Chunk ID: 458df1
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 213
Output:
if let Some(input) = input.split_prefix("//") {
return self.after_double_slash(input, scheme_type, scheme_end);
}
// Anarchist URL (no authority)
let path_start = to_u32(self.serialization.len())?;
let username_end = path_start;
let host_start = path_start;
let host_end = path_start;
let host = HostInternal::None;
let port = None;
let remaining = if let Some(input) = input.split_prefix('/') {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
} else {
self.parse_cannot_be_a_base_path(input)
};
self.with_query_and_fragment(
scheme_type,
scheme_end,
username_end,
sed -n '748,818p' url/src/parser.rs
Chunk ID: 1445f7
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 845
Output:
let (slashes_count, remaining) = input.count_matching(|c| matches!(c, '/' | '\\'));
if slashes_count >= 2 {
self.log_violation_if(SyntaxViolation::ExpectedDoubleSlash, || {
input
.clone()
.take_while(|&c| matches!(c, '/' | '\\'))
.collect::<String>()
!= "//"
});
let scheme_end = base_url.scheme_end;
debug_assert!(base_url.byte_at(scheme_end) == b':');
self.serialization
.push_str(base_url.slice(..scheme_end + 1));
if let Some(after_prefix) = input.split_prefix("//") {
return self.after_double_slash(after_prefix, scheme_type, scheme_end);
}
return self.after_double_slash(remaining, scheme_type, scheme_end);
}
let path_start = base_url.path_start;
self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
path_start as usize,
input_after_first_char,
);
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
base_url.host,
base_url.port,
base_url.path_start,
remaining,
)
}
_ => {
let before_query = match (base_url.query_start, base_url.fragment_start) {
(None, None) => &*base_url.serialization,
(Some(i), _) | (None, Some(i)) => base_url.slice(..i),
};
self.serialization.push_str(before_query);
// FIXME spec says just "remove last entry", not the "pop" algorithm
self.pop_path(scheme_type, base_url.path_start as usize);
// A special url always has a path.
// A path always starts with '/'
if self.serialization.len() == base_url.path_start as usize
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
base_url.path_start as usize,
remaining,
),
_ => {
self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
}
};
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
*** Begin Patch
*** Update File: url/src/parser.rs
@@
-use crate::Url;
+use crate::{Url, PATH_START_MARKER};
@@
- let remaining = if let Some(input) = input.split_prefix('/') {
- let path_start = self.serialization.len();
- self.serialization.push('/');
- self.parse_path(scheme_type, &mut false, path_start, input)
+ let remaining = if let Some(input) = input.split_prefix('/') {
+ if let Some(input) = input.split_prefix(".//") {
+ self.serialization.push_str(PATH_START_MARKER);
+ let logical_path_start = self.serialization.len();
+ self.parse_path(scheme_type, &mut false, logical_path_start, input)
+ } else {
+ let path_start = self.serialization.len();
+ self.serialization.push('/');
+ self.parse_path(scheme_type, &mut false, path_start, input)
+ }
} else {
self.parse_cannot_be_a_base_path(input)
};
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
}
let path_start = base_url.path_start;
+ let logical_path_start = base_url.logical_path_start();
self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
- path_start as usize,
+ logical_path_start as usize,
input_after_first_char,
);
@@
};
self.serialization.push_str(before_query);
// FIXME spec says just "remove last entry", not the "pop" algorithm
- self.pop_path(scheme_type, base_url.path_start as usize);
+ let logical_path_start = base_url.logical_path_start();
+ self.pop_path(scheme_type, logical_path_start as usize);
// A special url always has a path.
// A path always starts with '/'
- if self.serialization.len() == base_url.path_start as usize
+ if self.serialization.len() == logical_path_start as usize
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
- base_url.path_start as usize,
+ logical_path_start as usize,
remaining,
),
_ => {
- self.parse_path(scheme_type, &mut true, base_url.path_start as usize, input)
+ self.parse_path(scheme_type, &mut true, logical_path_start as usize, input)
}
};
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
- let path_start = base_url.path_start;
- let logical_path_start = base_url.logical_path_start();
+ let path_start = base_url.path_start;
self.serialization.push_str(base_url.slice(..path_start));
self.serialization.push('/');
let remaining = self.parse_path(
scheme_type,
&mut true,
- logical_path_start as usize,
+ path_start as usize,
input_after_first_char,
);
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
loop {
let input_before_c = input.clone();
match input.next_utf8() {
@@
}
}
}
+
+ fn has_path_start_marker(&self, path_start: usize) -> bool {
+ self.serialization[path_start..].starts_with("/.//")
+ }
+
+ fn normalize_path_start_marker(
+ &mut self,
+ scheme_type: SchemeType,
+ host: HostInternal,
+ path_start: u32,
+ ) -> ParseResult<()> {
+ if scheme_type.is_special() || host != HostInternal::None {
+ return Ok(());
+ }
+
+ let path_start = path_start as usize;
+ let has_marker = self.has_path_start_marker(path_start);
+ let logical_path_start = if has_marker {
+ path_start + PATH_START_MARKER.len()
+ } else {
+ path_start
+ };
+ let needs_marker = self.serialization[logical_path_start..].starts_with("//");
+
+ match (has_marker, needs_marker) {
+ (false, true) => {
+ to_u32(self.serialization.len() + PATH_START_MARKER.len())?;
+ self.serialization.insert_str(path_start, PATH_START_MARKER);
+ }
+ (true, false) => {
+ self.serialization
+ .drain(path_start..path_start + PATH_START_MARKER.len());
+ }
+ _ => {}
+ }
+
+ Ok(())
+ }
#[allow(clippy::too_many_arguments)]
fn with_query_and_fragment(
mut self,
scheme_type: SchemeType,
@@
path_start: u32,
remaining: Input<'_>,
) -> ParseResult<Url> {
+ self.normalize_path_start_marker(scheme_type, host, path_start)?;
let (query_start, fragment_start) =
self.parse_query_and_fragment(scheme_type, scheme_end, remaining)?;
Ok(Url {
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
- let remaining = if let Some(input) = input.split_prefix('/') {
- if let Some(input) = input.split_prefix(".//") {
- self.serialization.push_str(PATH_START_MARKER);
- let logical_path_start = self.serialization.len();
- self.parse_path(scheme_type, &mut false, logical_path_start, input)
+ let remaining = if let Some(input) = input.split_prefix('/') {
+ if let Some(input_after_dot) = input.split_prefix('.') {
+ let path_start = self.serialization.len();
+ self.parse_path(scheme_type, &mut false, path_start, input_after_dot)
} else {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
- let remaining = if let Some(input) = input.split_prefix('/') {
- if let Some(input_after_dot) = input.split_prefix('.') {
+ let remaining = if let Some(input) = input.split_prefix('/') {
+ if let Some(input_after_dot) = input.split_prefix('.') {
+ if input_after_dot.clone().split_prefix("//").is_none() {
+ let path_start = self.serialization.len();
+ self.serialization.push('/');
+ self.parse_path(scheme_type, &mut false, path_start, input)
+ } else {
let path_start = self.serialization.len();
self.parse_path(scheme_type, &mut false, path_start, input_after_dot)
+ }
} else {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
}
_ => {
- let before_query = match (base_url.query_start, base_url.fragment_start) {
- (None, None) => &*base_url.serialization,
- (Some(i), _) | (None, Some(i)) => base_url.slice(..i),
+ let before_query_end = match (base_url.query_start, base_url.fragment_start) {
+ (None, None) => base_url.serialization.len(),
+ (Some(i), _) | (None, Some(i)) => i as usize,
};
- self.serialization.push_str(before_query);
+ let path_start = base_url.path_start as usize;
// FIXME spec says just "remove last entry", not the "pop" algorithm
- let logical_path_start = base_url.logical_path_start();
- self.pop_path(scheme_type, logical_path_start as usize);
+ self.serialization
+ .push_str(base_url.slice(..base_url.path_start));
+ self.serialization
+ .push_str(&base_url.serialization[base_url.logical_path_start() as usize..before_query_end]);
+ self.pop_path(scheme_type, path_start);
// A special url always has a path.
// A path always starts with '/'
- if self.serialization.len() == logical_path_start as usize
+ if self.serialization.len() == path_start
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
- logical_path_start as usize,
+ path_start,
remaining,
),
- _ => {
- self.parse_path(scheme_type, &mut true, logical_path_start as usize, input)
- }
+ _ => self.parse_path(scheme_type, &mut true, path_start, input),
};
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
rg -n "trait RangeArg|impl RangeArg" url/src/lib.rs
Chunk ID: a4d174
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 34
Output:
2736:trait RangeArg {
2740:impl RangeArg for Range<u32> {
2747:impl RangeArg for RangeFrom<u32> {
2754:impl RangeArg for RangeTo<u32> {
*** Begin Patch
*** Update File: url/src/lib.rs
@@
if let Some(ref mut index) = self.fragment_start {
*index -= offset
}
+ self.normalize_path_start_marker();
}
Ok(())
}
@@
/// opt_new_port: None means leave unchanged, Some(None) means remove any port number.
fn set_host_internal(&mut self, host: Host<String>, opt_new_port: Option<Option<u16>>) {
let old_suffix_pos = if opt_new_port.is_some() {
self.path_start
+ } else if self.has_path_start_marker() {
+ self.logical_path_start()
} else {
self.host_end
};
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/lib.rs
*** Begin Patch
*** Update File: url/src/path_segments.rs
@@
pub fn new(url: &mut Url) -> PathSegmentsMut<'_> {
let after_path = url.take_after_path();
+ if url.has_path_start_marker() {
+ url.serialization.drain(
+ url.path_start as usize..url.path_start as usize + crate::PATH_START_MARKER.len(),
+ );
+ }
let old_after_path_position = to_u32(url.serialization.len()).unwrap();
// Special urls always have a non empty path
if SchemeType::from(url.scheme()).is_special() {
debug_assert!(url.byte_at(url.path_start) == b'/');
} else {
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/path_segments.rs
cargo fmt
Chunk ID: 0519b1 Wall time: 0.3922 seconds Process exited with code 1 Original token count: 35 Output: error: 'cargo-fmt' is not installed for the toolchain '1.85.1-aarch64-unknown-linux-gnu'. To install, run `rustup component add rustfmt`
sed -n '330,380p' url/src/lib.rs
Chunk ID: 113f9b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 362
Output:
return;
}
if self.fragment_start.is_some() {
return;
}
if self.query_start.is_some() {
return;
}
let trailing_space_count = self
.serialization
.chars()
.rev()
.take_while(|c| *c == ' ')
.count();
let start = self.serialization.len() - trailing_space_count;
self.serialization.truncate(start);
}
pub(crate) fn has_path_start_marker(&self) -> bool {
!self.has_authority()
&& !SchemeType::from(self.scheme()).is_special()
&& self.serialization[self.path_start as usize..].starts_with("/.//")
}
pub(crate) fn logical_path_start(&self) -> u32 {
if self.has_path_start_marker() {
self.path_start + PATH_START_MARKER.len() as u32
} else {
self.path_start
}
}
fn normalize_path_start_marker(&mut self) {
if self.has_authority() || SchemeType::from(self.scheme()).is_special() {
return;
}
let has_marker = self.has_path_start_marker();
let logical_path_start = if has_marker {
self.path_start as usize + PATH_START_MARKER.len()
} else {
self.path_start as usize
};
let needs_marker = self.serialization[logical_path_start..].starts_with("//");
match (has_marker, needs_marker) {
sed -n '470,490p' url/src/parser.rs
Chunk ID: 65cb2f
Wall time: 0.0001 seconds
Process exited with code 0
Original token count: 262
Output:
let path_start = to_u32(self.serialization.len())?;
let username_end = path_start;
let host_start = path_start;
let host_end = path_start;
let host = HostInternal::None;
let port = None;
let remaining = if let Some(input) = input.split_prefix('/') {
if let Some(input_after_dot) = input.split_prefix('.') {
if input_after_dot.clone().split_prefix("//").is_none() {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
} else {
let path_start = self.serialization.len();
self.parse_path(scheme_type, &mut false, path_start, input_after_dot)
}
} else {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
}
sed -n '780,820p' url/src/parser.rs
Chunk ID: 059393
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 473
Output:
let remaining = self.parse_path(
scheme_type,
&mut true,
path_start as usize,
input_after_first_char,
);
self.with_query_and_fragment(
scheme_type,
base_url.scheme_end,
base_url.username_end,
base_url.host_start,
base_url.host_end,
base_url.host,
base_url.port,
base_url.path_start,
remaining,
)
}
_ => {
let before_query_end = match (base_url.query_start, base_url.fragment_start) {
(None, None) => base_url.serialization.len(),
(Some(i), _) | (None, Some(i)) => i as usize,
};
let path_start = base_url.path_start as usize;
// FIXME spec says just "remove last entry", not the "pop" algorithm
self.serialization
.push_str(base_url.slice(..base_url.path_start));
self.serialization
.push_str(&base_url.serialization[base_url.logical_path_start() as usize..before_query_end]);
self.pop_path(scheme_type, path_start);
// A special url always has a path.
// A path always starts with '/'
if self.serialization.len() == path_start
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
scheme_type,
&mut true,
sed -n '1330,1395p' url/src/parser.rs
Chunk ID: 1c48c5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 600
Output:
if self.serialization.len() > path_start {
let slash_position = self.serialization[path_start..].rfind('/').unwrap();
// + 1 since rfind returns the position before the slash.
let segment_start = path_start + slash_position + 1;
// Don’t pop a Windows drive letter
if !(scheme_type.is_file()
&& is_normalized_windows_drive_letter(&self.serialization[segment_start..]))
{
self.serialization.truncate(segment_start);
}
}
}
pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
loop {
let input_before_c = input.clone();
match input.next_utf8() {
Some(('?', _)) | Some(('#', _)) if self.context == Context::UrlParser => {
return input_before_c
}
Some((c, utf8_c)) => {
self.check_url_code_point(c, &input);
self.serialization
.extend(utf8_percent_encode(utf8_c, CONTROLS));
}
None => return input,
}
}
}
fn has_path_start_marker(&self, path_start: usize) -> bool {
self.serialization[path_start..].starts_with("/.//")
}
fn normalize_path_start_marker(
&mut self,
scheme_type: SchemeType,
host: HostInternal,
path_start: u32,
) -> ParseResult<()> {
if scheme_type.is_special() || host != HostInternal::None {
return Ok(());
}
let path_start = path_start as usize;
let has_marker = self.has_path_start_marker(path_start);
let logical_path_start = if has_marker {
path_start + PATH_START_MARKER.len()
} else {
path_start
};
let needs_marker = self.serialization[logical_path_start..].starts_with("//");
match (has_marker, needs_marker) {
(false, true) => {
to_u32(self.serialization.len() + PATH_START_MARKER.len())?;
self.serialization.insert_str(path_start, PATH_START_MARKER);
}
(true, false) => {
self.serialization
.drain(path_start..path_start + PATH_START_MARKER.len());
}
_ => {}
}
Ok(())
*** Begin Patch
*** Update File: url/src/parser.rs
@@
let port = None;
let remaining = if let Some(input) = input.split_prefix('/') {
if let Some(input_after_dot) = input.split_prefix('.') {
if input_after_dot.clone().split_prefix("//").is_none() {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
} else {
- let path_start = self.serialization.len();
- self.parse_path(scheme_type, &mut false, path_start, input_after_dot)
+ let path_start = self.serialization.len();
+ self.parse_path(scheme_type, &mut false, path_start, input_after_dot)
}
} else {
let path_start = self.serialization.len();
self.serialization.push('/');
@@
self.serialization
.push_str(base_url.slice(..base_url.path_start));
- self.serialization
- .push_str(&base_url.serialization[base_url.logical_path_start() as usize..before_query_end]);
+ self.serialization.push_str(
+ &base_url.serialization[base_url.logical_path_start() as usize
+ ..before_query_end],
+ );
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/tests/unit.rs
@@
fn test_non_special_path3() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("/");
@@
assert_eq!(url.path(), "/foo");
}
+#[test]
+fn test_non_special_hostless_double_slash_path_marker() {
+ use url::Position;
+
+ let url = Url::parse("foo:/.//a?b#c").unwrap();
+ assert_eq!(url.as_str(), "foo:/.//a?b#c");
+ assert_eq!(url.path(), "//a");
+ assert_eq!(url.query(), Some("b"));
+ assert_eq!(url.fragment(), Some("c"));
+ assert_eq!(&url[Position::AfterPort..Position::BeforePath], "/.");
+ assert_eq!(&url[Position::BeforePath..Position::AfterPath], "//a");
+
+ let reparsed = Url::parse(url.as_str()).unwrap();
+ assert_eq!(reparsed.scheme(), url.scheme());
+ assert_eq!(reparsed.host_str(), url.host_str());
+ assert_eq!(reparsed.path(), url.path());
+ assert_eq!(reparsed.query(), url.query());
+ assert_eq!(reparsed.fragment(), url.fragment());
+ assert_eq!(
+ &reparsed[Position::AfterPort..Position::BeforePath],
+ "/."
+ );
+
+ let normalized = Url::parse("foo:/x/..//a").unwrap();
+ assert_eq!(normalized.as_str(), "foo:/.//a");
+ assert_eq!(normalized.path(), "//a");
+
+ let mut set_path = Url::parse("foo:/").unwrap();
+ set_path.set_path("//a");
+ assert_eq!(set_path.as_str(), "foo:/.//a");
+ assert_eq!(set_path.path(), "//a");
+ set_path.set_path("/a");
+ assert_eq!(set_path.as_str(), "foo:/a");
+ assert_eq!(set_path.path(), "/a");
+
+ let mut segments = Url::parse("foo:/.//a").unwrap();
+ segments.path_segments_mut().unwrap().clear();
+ assert_eq!(segments.as_str(), "foo:/");
+ assert_eq!(segments.path(), "/");
+}
+
+#[test]
+fn test_non_special_hostless_double_slash_path_marker_join() {
+ let base = Url::parse("foo:/.//a/b?old#frag").unwrap();
+
+ let child = base.join("c").unwrap();
+ assert_eq!(child.as_str(), "foo:/.//a/c");
+ assert_eq!(child.path(), "//a/c");
+
+ let query = base.join("?q").unwrap();
+ assert_eq!(query.as_str(), "foo:/.//a/b?q");
+ assert_eq!(query.path(), "//a/b");
+
+ let fragment = base.join("#new").unwrap();
+ assert_eq!(fragment.as_str(), "foo:/.//a/b?old#new");
+ assert_eq!(fragment.path(), "//a/b");
+
+ let absolute = base.join("/single").unwrap();
+ assert_eq!(absolute.as_str(), "foo:/single");
+ assert_eq!(absolute.path(), "/single");
+
+ let parent = Url::parse("foo:/.//a").unwrap().join("../b").unwrap();
+ assert_eq!(parent.as_str(), "foo:/b");
+ assert_eq!(parent.path(), "/b");
+}
+
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");
*** End Patch
apply_patch verification failed: Failed to find expected lines in /app/url/tests/unit.rs:
assert_eq!(url.path(), "/foo");
}
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");sed -n '920,950p' url/tests/unit.rs
Chunk ID: 5ad4ea
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 282
Output:
db_url.set_path("");
assert_eq!(db_url.path(), "");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost");
db_url.set_path("foo");
assert_eq!(db_url.path(), "/foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
db_url.set_path("/bar");
assert_eq!(db_url.path(), "/bar");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/bar");
}
#[test]
fn test_non_special_path3() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("/");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
assert_eq!(db_url.path(), "/");
db_url.set_path("/foo");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo");
assert_eq!(db_url.path(), "/foo");
}
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");
assert_eq!(url.to_string(), "http://localhost:6767/foo/bar");
assert_eq!(result, Err(()));
}
*** Begin Patch
*** Update File: url/tests/unit.rs
@@
fn test_non_special_path3() {
let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap();
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
db_url.set_path("/");
assert_eq!(db_url.as_str(), "postgres://postgres@localhost/");
@@
assert_eq!(db_url.path(), "/foo");
}
+#[test]
+fn test_non_special_hostless_double_slash_path_marker() {
+ use url::Position;
+
+ let url = Url::parse("foo:/.//a?b#c").unwrap();
+ assert_eq!(url.as_str(), "foo:/.//a?b#c");
+ assert_eq!(url.path(), "//a");
+ assert_eq!(url.query(), Some("b"));
+ assert_eq!(url.fragment(), Some("c"));
+ assert_eq!(&url[Position::AfterPort..Position::BeforePath], "/.");
+ assert_eq!(&url[Position::BeforePath..Position::AfterPath], "//a");
+
+ let reparsed = Url::parse(url.as_str()).unwrap();
+ assert_eq!(reparsed.scheme(), url.scheme());
+ assert_eq!(reparsed.host_str(), url.host_str());
+ assert_eq!(reparsed.path(), url.path());
+ assert_eq!(reparsed.query(), url.query());
+ assert_eq!(reparsed.fragment(), url.fragment());
+ assert_eq!(
+ &reparsed[Position::AfterPort..Position::BeforePath],
+ "/."
+ );
+
+ let normalized = Url::parse("foo:/x/..//a").unwrap();
+ assert_eq!(normalized.as_str(), "foo:/.//a");
+ assert_eq!(normalized.path(), "//a");
+
+ let mut set_path = Url::parse("foo:/").unwrap();
+ set_path.set_path("//a");
+ assert_eq!(set_path.as_str(), "foo:/.//a");
+ assert_eq!(set_path.path(), "//a");
+ set_path.set_path("/a");
+ assert_eq!(set_path.as_str(), "foo:/a");
+ assert_eq!(set_path.path(), "/a");
+
+ let mut segments = Url::parse("foo:/.//a").unwrap();
+ segments.path_segments_mut().unwrap().clear();
+ assert_eq!(segments.as_str(), "foo:/");
+ assert_eq!(segments.path(), "/");
+}
+
+#[test]
+fn test_non_special_hostless_double_slash_path_marker_join() {
+ let base = Url::parse("foo:/.//a/b?old#frag").unwrap();
+
+ let child = base.join("c").unwrap();
+ assert_eq!(child.as_str(), "foo:/.//a/c");
+ assert_eq!(child.path(), "//a/c");
+
+ let query = base.join("?q").unwrap();
+ assert_eq!(query.as_str(), "foo:/.//a/b?q");
+ assert_eq!(query.path(), "//a/b");
+
+ let fragment = base.join("#new").unwrap();
+ assert_eq!(fragment.as_str(), "foo:/.//a/b?old#new");
+ assert_eq!(fragment.path(), "//a/b");
+
+ let absolute = base.join("/single").unwrap();
+ assert_eq!(absolute.as_str(), "foo:/single");
+ assert_eq!(absolute.path(), "/single");
+
+ let parent = Url::parse("foo:/.//a").unwrap().join("../b").unwrap();
+ assert_eq!(parent.as_str(), "foo:/b");
+ assert_eq!(parent.path(), "/b");
+}
+
#[test]
fn test_set_scheme_to_file_with_host() {
let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
let result = url.set_scheme("file");
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/tests/unit.rs
cargo test -p url non_special_hostless_double_slash_path_marker --locked
Chunk ID: e8da5e
Wall time: 0.5731 seconds
Process exited with code 101
Original token count: 796
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.70s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_hostless_double_slash_path_marker_join ... ok
test test_non_special_hostless_double_slash_path_marker ... FAILED
failures:
---- test_non_special_hostless_double_slash_path_marker stdout ----
thread 'test_non_special_hostless_double_slash_path_marker' panicked at url/tests/unit.rs:972:5:
assertion `left == right` failed
left: "foo://a"
right: "foo:/.//a"
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
test_non_special_hostless_double_slash_path_marker
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
error: test failed, to rerun pass `-p url --test unit`
nl -ba url/tests/unit.rs | sed -n '960,980p'
Chunk ID: 12b5c2
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 222
Output:
960 assert_eq!(reparsed.fragment(), url.fragment());
961 assert_eq!(
962 &reparsed[Position::AfterPort..Position::BeforePath],
963 "/."
964 );
965
966 let normalized = Url::parse("foo:/x/..//a").unwrap();
967 assert_eq!(normalized.as_str(), "foo:/.//a");
968 assert_eq!(normalized.path(), "//a");
969
970 let mut set_path = Url::parse("foo:/").unwrap();
971 set_path.set_path("//a");
972 assert_eq!(set_path.as_str(), "foo:/.//a");
973 assert_eq!(set_path.path(), "//a");
974 set_path.set_path("/a");
975 assert_eq!(set_path.as_str(), "foo:/a");
976 assert_eq!(set_path.path(), "/a");
977
978 let mut segments = Url::parse("foo:/.//a").unwrap();
979 segments.path_segments_mut().unwrap().clear();
980 assert_eq!(segments.as_str(), "foo:/");
*** Begin Patch
*** Update File: url/src/lib.rs
@@
pub(crate) fn has_path_start_marker(&self) -> bool {
- !self.has_authority()
+ self.host == HostInternal::None
&& !SchemeType::from(self.scheme()).is_special()
&& self.serialization[self.path_start as usize..].starts_with("/.//")
}
@@
fn normalize_path_start_marker(&mut self) {
- if self.has_authority() || SchemeType::from(self.scheme()).is_special() {
+ if self.host != HostInternal::None || SchemeType::from(self.scheme()).is_special() {
return;
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/lib.rs
cargo test -p url non_special_hostless_double_slash_path_marker --locked
Chunk ID: aa125c
Wall time: 0.1854 seconds
Process exited with code 0
Original token count: 681
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.31s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_hostless_double_slash_path_marker_join ... ok
test test_non_special_hostless_double_slash_path_marker ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
cargo test -p url --locked
Chunk ID: c9a9cb
Wall time: 0.0000 seconds
Process exited with code 101
Original token count: 783
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.01s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 2 tests
test setters_tests ... ok
test urltestdata ... FAILED
failures:
---- urltestdata stdout ----
test: "foo://///////" - href
expected: foo://///////
actual: foo:///.///////
test: "foo://///////bar.com/" - href
expected: foo://///////bar.com/
actual: foo:///.///////bar.com/
test: "foo:////://///" - href
expected: foo:////://///
actual: foo:///.//://///
test: "////" - href
expected: sc:////
actual: sc:///.//
test: "////x/" - href
expected: sc:////x/
actual: sc:///.//x/
thread 'urltestdata' panicked at url/tests/data.rs:107:5:
assertion failed: passed
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
urltestdata
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
error: test failed, to rerun pass `-p url --test data`
*** Begin Patch
*** Update File: url/src/parser.rs
@@
let host_start = to_u32(self.serialization.len())?;
let (host_end, host, port, remaining) =
self.parse_host_and_port(remaining, scheme_end, scheme_type)?;
+ if !scheme_type.is_special() && host == HostInternal::None && !has_authority {
+ self.serialization.truncate(scheme_end as usize + 1);
+ let path_start = to_u32(self.serialization.len())?;
+ self.serialization.push_str("//");
+ let remaining = self.parse_path(scheme_type, &mut false, path_start as usize, remaining);
+ return self.with_query_and_fragment(
+ scheme_type,
+ scheme_end,
+ path_start,
+ path_start,
+ path_start,
+ host,
+ port,
+ path_start,
+ remaining,
+ );
+ }
if host == HostInternal::None && has_authority {
return Err(ParseError::EmptyHost);
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
cargo test -p url --test data urltestdata --locked
Chunk ID: b63876
Wall time: 0.1723 seconds
Process exited with code 101
Original token count: 1162
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.29s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 1 test
test urltestdata ... FAILED
failures:
---- urltestdata stdout ----
test: "foo://" - href
expected: foo://
actual: foo:/.//
test: "foo://" - pathname
expected:
actual: //
test: "foo://///////" - href
expected: foo://///////
actual: foo:/./////////
test: "foo://///////" - pathname
expected: ///////
actual: /////////
test: "foo://///////bar.com/" - href
expected: foo://///////bar.com/
actual: foo:/./////////bar.com/
test: "foo://///////bar.com/" - pathname
expected: ///////bar.com/
actual: /////////bar.com/
test: "foo:////://///" - href
expected: foo:////://///
actual: foo:/.////://///
test: "foo:////://///" - pathname
expected: //://///
actual: ////://///
test: "i" - href
expected: sc:///pa/i
actual: sc:/.///pa/i
test: "i" - pathname
expected: /pa/i
actual: ///pa/i
test: "../i" - href
expected: sc:///i
actual: sc:/.///i
test: "../i" - pathname
expected: /i
actual: ///i
test: "/i" - href
expected: sc:///i
actual: sc:/i
test: "?i" - href
expected: sc:///pa/pa?i
actual: sc:/.///pa/pa?i
test: "?i" - pathname
expected: /pa/pa
actual: ///pa/pa
test: "#i" - href
expected: sc:///pa/pa#i
actual: sc:/.///pa/pa#i
test: "#i" - pathname
expected: /pa/pa
actual: ///pa/pa
test: "sc://?" - href
expected: sc://?
actual: sc:/.//?
test: "sc://?" - pathname
expected:
actual: //
test: "sc://#" - href
expected: sc://#
actual: sc:/.//#
test: "sc://#" - pathname
expected:
actual: //
test: "///" - href
expected: sc:///
actual: sc:/.///
test: "///" - pathname
expected: /
actual: ///
test: "////" - href
expected: sc:////
actual: sc:/.////
test: "////" - pathname
expected: //
actual: ////
test: "////x/" - href
expected: sc:////x/
actual: sc:/.////x/
test: "////x/" - pathname
expected: //x/
actual: ////x/
test: "test-a-colon-slash-slash.html" - href
expected: a:///test-a-colon-slash-slash.html
actual: a:/.//test-a-colon-slash-slash.html
test: "test-a-colon-slash-slash.html" - pathname
expected: /test-a-colon-slash-slash.html
actual: //test-a-colon-slash-slash.html
thread 'urltestdata' panicked at url/tests/data.rs:107:5:
assertion failed: passed
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
urltestdata
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.01s
error: test failed, to rerun pass `-p url --test data`
*** Begin Patch
*** Update File: url/src/parser.rs
@@
let host_start = to_u32(self.serialization.len())?;
let (host_end, host, port, remaining) =
self.parse_host_and_port(remaining, scheme_end, scheme_type)?;
- if !scheme_type.is_special() && host == HostInternal::None && !has_authority {
- self.serialization.truncate(scheme_end as usize + 1);
- let path_start = to_u32(self.serialization.len())?;
- self.serialization.push_str("//");
- let remaining = self.parse_path(scheme_type, &mut false, path_start as usize, remaining);
- return self.with_query_and_fragment(
- scheme_type,
- scheme_end,
- path_start,
- path_start,
- path_start,
- host,
- port,
- path_start,
- remaining,
- );
- }
if host == HostInternal::None && has_authority {
return Err(ParseError::EmptyHost);
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
*** Begin Patch
*** Update File: url/src/lib.rs
@@
pub(crate) fn has_path_start_marker(&self) -> bool {
self.host == HostInternal::None
+ && self.path_start == self.scheme_end + 1
&& !SchemeType::from(self.scheme()).is_special()
&& self.serialization[self.path_start as usize..].starts_with("/.//")
}
@@
- if self.host != HostInternal::None || SchemeType::from(self.scheme()).is_special() {
+ if self.host != HostInternal::None
+ || self.path_start != self.scheme_end + 1
+ || SchemeType::from(self.scheme()).is_special()
+ {
return;
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/lib.rs
*** Begin Patch
*** Update File: url/src/parser.rs
@@
- if scheme_type.is_special() || host != HostInternal::None {
+ if scheme_type.is_special()
+ || host != HostInternal::None
+ || path_start != scheme_end + 1
+ {
return Ok(());
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
cargo test -p url non_special_hostless_double_slash_path_marker --locked
Chunk ID: ece5dc
Wall time: 0.0457 seconds
Process exited with code 101
Original token count: 611
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
error[E0425]: cannot find value `scheme_end` in this scope
--> url/src/parser.rs:1374:30
|
1374 | || path_start != scheme_end + 1
| ^^^^^^^^^^ not found in this scope
For more information about this error, try `rustc --explain E0425`.
error: could not compile `url` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
error: could not compile `url` (lib test) due to 1 previous error
cargo test -p url --test data urltestdata --locked
Chunk ID: f521d2
Wall time: 0.1254 seconds
Process exited with code 101
Original token count: 594
Output:
Blocking waiting for file lock on build directory
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
error[E0425]: cannot find value `scheme_end` in this scope
--> url/src/parser.rs:1374:30
|
1374 | || path_start != scheme_end + 1
| ^^^^^^^^^^ not found in this scope
For more information about this error, try `rustc --explain E0425`.
error: could not compile `url` (lib) due to 1 previous error
*** Begin Patch
*** Update File: url/src/parser.rs
@@
fn normalize_path_start_marker(
&mut self,
scheme_type: SchemeType,
+ scheme_end: u32,
host: HostInternal,
path_start: u32,
) -> ParseResult<()> {
@@
- self.normalize_path_start_marker(scheme_type, host, path_start)?;
+ self.normalize_path_start_marker(scheme_type, scheme_end, host, path_start)?;
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/parser.rs
cargo test -p url non_special_hostless_double_slash_path_marker --locked
Chunk ID: c5ea74
Wall time: 0.3075 seconds
Process exited with code 0
Original token count: 681
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.44s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 2 tests
test test_non_special_hostless_double_slash_path_marker_join ... ok
test test_non_special_hostless_double_slash_path_marker ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 58 filtered out; finished in 0.00s
cargo test -p url --test data urltestdata --locked
Chunk ID: 1a52f6
Wall time: 0.2805 seconds
Process exited with code 0
Original token count: 566
Output:
Blocking waiting for file lock on build directory
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.41s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 1 test
test urltestdata ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.01s
cargo test -p url --locked
Chunk ID: b5c1c5
Wall time: 0.0000 seconds
Process exited with code 101
Original token count: 1219
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.01s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 2 tests
test setters_tests ... ok
test urltestdata ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 60 tests
test append_empty_segment_then_mutate ... ok
test append_trailing_slash ... ok
test form_urlencoded_encoding_override ... ok
test extend_query_pairs_then_mutate ... ok
test from_str ... ok
test host_serialization ... ok
test issue_124 ... ok
test host ... ok
test issue_197 ... ok
test issue_241 ... ok
test issue_61 ... ok
test new_directory_paths ... ok
test new_file_paths ... ok
test new_path_bad_utf8 ... ok
test new_path_windows_fun ... ok
test parse_with_params ... ok
test no_panic ... FAILED
test path_backslash_fun ... ok
test pop_if_empty_in_bounds ... ok
test size ... ok
test test_domain ... ok
test test_authority ... ok
test test_domain_encoding_quirks ... ok
test test_equality ... ok
test test_form_serialize ... ok
test test_form_urlencoded ... ok
test test_fragment ... ok
test test_has_authority ... ok
test test_idna ... ok
test test_leading_dots ... ok
test test_no_base_url ... ok
test test_non_special_hostless_double_slash_path_marker ... ok
test test_non_special_hostless_double_slash_path_marker_join ... ok
test test_non_special_path ... ok
test test_non_special_path2 ... ok
test test_non_special_path3 ... ok
test test_make_relative ... ok
test test_options_reuse ... ok
test test_origin_blob_equality ... ok
test test_origin_opaque ... ok
test test_origin_hash ... ok
test test_query ... ok
test test_relative ... ok
test test_origin_unicode_serialization ... ok
test test_relative_empty ... ok
test test_serialization ... ok
test test_set_empty_host ... ok
test test_set_empty_hostname ... ok
test test_set_host ... ok
test test_set_href ... ok
test test_set_ip_host ... ok
test test_set_scheme_to_file_with_host ... ok
test test_slicing ... ok
test test_strip_trailing_spaces_from_opaque_path ... ok
test test_syntax_violation_callback ... ok
test test_syntax_violation_callback_lifetimes ... ok
test test_syntax_violation_callback_types ... ok
test test_url_from_file_path ... ok
test test_windows_unc_path ... ok
test test_socket_addrs ... ok
failures:
---- no_panic stdout ----
thread 'no_panic' panicked at url/src/lib.rs:2035:13:
attempt to subtract with overflow
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
no_panic
test result: FAILED. 59 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: test failed, to rerun pass `-p url --test unit`
nl -ba url/src/lib.rs | sed -n '2018,2042p'
Chunk ID: c29a78
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 269
Output:
2018 self.username_end += 2;
2019 self.host_start += 2;
2020 }
2021 write!(&mut self.serialization, "{}", host).unwrap();
2022 self.host_end = to_u32(self.serialization.len()).unwrap();
2023 self.host = host.into();
2024
2025 if let Some(new_port) = opt_new_port {
2026 self.port = new_port;
2027 if let Some(port) = new_port {
2028 write!(&mut self.serialization, ":{}", port).unwrap();
2029 }
2030 }
2031 let new_suffix_pos = to_u32(self.serialization.len()).unwrap();
2032 self.serialization.push_str(&suffix);
2033
2034 let adjust = |index: &mut u32| {
2035 *index -= old_suffix_pos;
2036 *index += new_suffix_pos;
2037 };
2038 adjust(&mut self.path_start);
2039 if let Some(ref mut index) = self.query_start {
2040 adjust(index)
2041 }
2042 if let Some(ref mut index) = self.fragment_start {
*** Begin Patch
*** Update File: url/src/lib.rs
@@
/// opt_new_port: None means leave unchanged, Some(None) means remove any port number.
fn set_host_internal(&mut self, host: Host<String>, opt_new_port: Option<Option<u16>>) {
+ let old_path_start = self.path_start;
let old_suffix_pos = if opt_new_port.is_some() {
self.path_start
} else if self.has_path_start_marker() {
self.logical_path_start()
@@
*index -= old_suffix_pos;
*index += new_suffix_pos;
};
- adjust(&mut self.path_start);
+ if old_suffix_pos > old_path_start {
+ self.path_start = new_suffix_pos;
+ } else {
+ adjust(&mut self.path_start);
+ }
if let Some(ref mut index) = self.query_start {
adjust(index)
}
*** End Patch
Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M url/src/lib.rs
cargo test -p url --locked
Chunk ID: d507e1
Wall time: 3.6024 seconds
Process exited with code 0
Original token count: 2147
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
Compiling url v2.3.1 (/app/url)
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.34s
Running unittests src/lib.rs (target/debug/deps/url-2559718008fa8f63)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/data.rs (target/debug/deps/data-2c0f19163cfb41ae)
running 2 tests
test setters_tests ... ok
test urltestdata ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running tests/unit.rs (target/debug/deps/unit-a494890561398094)
running 60 tests
test append_empty_segment_then_mutate ... ok
test append_trailing_slash ... ok
test form_urlencoded_encoding_override ... ok
test extend_query_pairs_then_mutate ... ok
test from_str ... ok
test host_serialization ... ok
test issue_124 ... ok
test host ... ok
test issue_197 ... ok
test issue_241 ... ok
test issue_61 ... ok
test new_directory_paths ... ok
test new_file_paths ... ok
test new_path_bad_utf8 ... ok
test new_path_windows_fun ... ok
test no_panic ... ok
test parse_with_params ... ok
test path_backslash_fun ... ok
test pop_if_empty_in_bounds ... ok
test size ... ok
test test_authority ... ok
test test_domain ... ok
test test_equality ... ok
test test_domain_encoding_quirks ... ok
test test_form_serialize ... ok
test test_form_urlencoded ... ok
test test_fragment ... ok
test test_has_authority ... ok
test test_idna ... ok
test test_leading_dots ... ok
test test_no_base_url ... ok
test test_non_special_hostless_double_slash_path_marker ... ok
test test_non_special_hostless_double_slash_path_marker_join ... ok
test test_non_special_path ... ok
test test_non_special_path2 ... ok
test test_make_relative ... ok
test test_non_special_path3 ... ok
test test_options_reuse ... ok
test test_origin_blob_equality ... ok
test test_origin_hash ... ok
test test_origin_opaque ... ok
test test_query ... ok
test test_relative ... ok
test test_origin_unicode_serialization ... ok
test test_relative_empty ... ok
test test_serialization ... ok
test test_set_empty_host ... ok
test test_set_host ... ok
test test_set_empty_hostname ... ok
test test_set_ip_host ... ok
test test_set_href ... ok
test test_set_scheme_to_file_with_host ... ok
test test_slicing ... ok
test test_strip_trailing_spaces_from_opaque_path ... ok
test test_syntax_violation_callback ... ok
test test_socket_addrs ... ok
test test_syntax_violation_callback_lifetimes ... ok
test test_url_from_file_path ... ok
test test_syntax_violation_callback_types ... ok
test test_windows_unc_path ... ok
test result: ok. 60 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests url
running 66 tests
test url/src/lib.rs - (line 18) ... ok
test url/src/lib.rs - (line 26) ... ok
test url/src/lib.rs - (line 57) ... ok
test url/src/lib.rs - (line 89) ... ok
test url/src/lib.rs - (line 97) ... ok
test url/src/lib.rs - ParseOptions<'a>::syntax_violation_callback (line 224) ... ok
test url/src/lib.rs - Url::as_str (line 615) ... ok
test url/src/lib.rs - Url::authority (line 921) ... ok
test url/src/lib.rs - Url::cannot_be_a_base (line 957) ... ok
test url/src/lib.rs - Url::domain (line 1160) ... ok
test url/src/lib.rs - Url::fragment (line 1459) ... ok
test url/src/lib.rs - Url::from_file_path (line 2445) ... ok
test url/src/lib.rs - Url::has_host (line 1052) ... ok
test url/src/lib.rs - Url::has_authority (line 885) ... ok
test url/src/lib.rs - Url::host (line 1125) ... ok
test url/src/lib.rs - Url::host_str (line 1086) ... ok
test url/src/lib.rs - Url::into_string (line 638) ... ok
test url/src/lib.rs - Url::join (line 421) ... ok
test url/src/lib.rs - Url::options (line 588) ... ok
test url/src/lib.rs - Url::make_relative (line 456) ... ok
test url/src/lib.rs - Url::origin (line 805) ... ok
test url/src/lib.rs - Url::origin (line 788) ... ok
test url/src/lib.rs - Url::origin (line 822) ... ok
test url/src/lib.rs - Url::origin (line 839) ... ok
test url/src/lib.rs - Url::parse (line 263) ... ok
test url/src/lib.rs - Url::parse_with_params (line 291) ... ok
test url/src/lib.rs - Url::password (line 1014) ... ok
test url/src/lib.rs - Url::path (line 1307) ... ok
test url/src/lib.rs - Url::port (line 1191) ... ok
test url/src/lib.rs - Url::path_segments (line 1344) ... ok
test url/src/lib.rs - Url::port_or_known_default (line 1223) ... ok
test url/src/lib.rs - Url::query (line 1380) ... ok
test url/src/lib.rs - Url::query_pairs (line 1419) ... ok
test url/src/lib.rs - Url::query_pairs_mut (line 1601) ... ok
test url/src/lib.rs - Url::scheme (line 859) ... ok
test url/src/lib.rs - Url::set_fragment (line 1493) ... ok
test url/src/lib.rs - Url::set_host (line 1880) ... ok
test url/src/lib.rs - Url::set_host (line 1864) ... ok
test url/src/lib.rs - Url::set_host (line 1896) ... ok
test url/src/lib.rs - Url::set_host (line 1912) ... ok
test url/src/lib.rs - Url::set_ip_host (line 2060) ... ok
test url/src/lib.rs - Url::set_ip_host (line 2075) ... ok
test url/src/lib.rs - Url::set_password (line 2109) ... ok
test url/src/lib.rs - Url::set_path (line 1663) ... ok
test url/src/lib.rs - Url::set_port (line 1752) ... ok
test url/src/lib.rs - Url::set_port (line 1771) ... ok
test url/src/lib.rs - Url::set_port (line 1787) ... ok
test url/src/lib.rs - Url::set_query (line 1551) ... ok
test url/src/lib.rs - Url::set_scheme (line 2309) ... ok
test url/src/lib.rs - Url::set_scheme (line 2294) ... ok
test url/src/lib.rs - Url::set_scheme (line 2325) ... ok
test url/src/lib.rs - Url::set_scheme (line 2341) ... ok
test url/src/lib.rs - Url::set_scheme (line 2371) ... ok
test url/src/lib.rs - Url::set_scheme (line 2356) ... ok
test url/src/lib.rs - Url::set_username (line 2209) ... ok
test url/src/lib.rs - Url::set_username (line 2194) ... ok
test url/src/lib.rs - Url::socket_addrs (line 1256) - compile ... ok
test url/src/lib.rs - Url::socket_addrs (line 1263) ... ok
test url/src/lib.rs - Url::to_file_path (line 2605) ... ok
test url/src/lib.rs - Url::username (line 984) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut (line 20) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::clear (line 85) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::extend (line 188) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::extend (line 208) ... ok
test url/src/path_segments.rs - path_segments::PathSegmentsMut<'a>::pop_if_empty (line 113) ... ok
test url/src/slicing.rs - slicing::Position (line 44) ... ok
test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.27s
cargo build --locked
Chunk ID: 51d255
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 755
Output:
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> percent_encoding/src/lib.rs:462:35
|
462 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
462 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
462 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `percent-encoding` (lib) generated 1 warning
warning: ambiguous wide pointer comparison, the comparison includes metadata which may not be expected
--> form_urlencoded/src/lib.rs:403:35
|
403 | debug_assert!(raw_utf8 == &*bytes as *const [u8]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(ambiguous_wide_pointer_comparisons)]` on by default
help: use `std::ptr::addr_eq` or untyped pointers to only compare their addresses
|
403 | debug_assert!(std::ptr::addr_eq(raw_utf8, &*bytes as *const [u8]));
| ++++++++++++++++++ ~ +
help: use explicit `std::ptr::eq` method to compare metadata and addresses
|
403 | debug_assert!(std::ptr::eq(raw_utf8, &*bytes as *const [u8]));
| +++++++++++++ ~ +
warning: `form_urlencoded` (lib) generated 1 warning
warning: field `0` is never read
--> data-url/src/forgiving_base64.rs:4:26
|
4 | pub struct InvalidBase64(InvalidBase64Details);
| ------------- ^^^^^^^^^^^^^^^^^^^^
| |
| field in this struct
|
= help: consider removing this field
= note: `InvalidBase64` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
= note: `#[warn(dead_code)]` on by default
warning: field `0` is never read
--> data-url/src/forgiving_base64.rs:8:22
|
8 | UnexpectedSymbol(u8),
| ---------------- ^^
| |
| field in this variant
|
= note: `InvalidBase64Details` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
help: consider changing the field to be of unit type to suppress this warning while preserving the field numbering, or remove the field
|
8 | UnexpectedSymbol(()),
| ~~
warning: `data-url` (lib) generated 2 warnings
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
sed -n '350,390p' url/src/lib.rs
Chunk ID: 2e040e
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 367
Output:
self.serialization.truncate(start);
}
pub(crate) fn has_path_start_marker(&self) -> bool {
self.host == HostInternal::None
&& self.path_start == self.scheme_end + 1
&& !SchemeType::from(self.scheme()).is_special()
&& self.serialization[self.path_start as usize..].starts_with("/.//")
}
pub(crate) fn logical_path_start(&self) -> u32 {
if self.has_path_start_marker() {
self.path_start + PATH_START_MARKER.len() as u32
} else {
self.path_start
}
}
fn normalize_path_start_marker(&mut self) {
if self.host != HostInternal::None
|| self.path_start != self.scheme_end + 1
|| SchemeType::from(self.scheme()).is_special()
{
return;
}
let has_marker = self.has_path_start_marker();
let logical_path_start = if has_marker {
self.path_start as usize + PATH_START_MARKER.len()
} else {
self.path_start as usize
};
let needs_marker = self.serialization[logical_path_start..].starts_with("//");
match (has_marker, needs_marker) {
(false, true) => {
self.serialization
.insert_str(self.path_start as usize, PATH_START_MARKER);
if let Some(ref mut index) = self.query_start {
*index += PATH_START_MARKER.len() as u32;
}
sed -n '470,492p' url/src/parser.rs
Chunk ID: 8afeb9
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 281
Output:
let path_start = to_u32(self.serialization.len())?;
let username_end = path_start;
let host_start = path_start;
let host_end = path_start;
let host = HostInternal::None;
let port = None;
let remaining = if let Some(input) = input.split_prefix('/') {
if let Some(input_after_dot) = input.split_prefix('.') {
if input_after_dot.clone().split_prefix("//").is_none() {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
} else {
let path_start = self.serialization.len();
self.parse_path(scheme_type, &mut false, path_start, input_after_dot)
}
} else {
let path_start = self.serialization.len();
self.serialization.push('/');
self.parse_path(scheme_type, &mut false, path_start, input)
}
} else {
self.parse_cannot_be_a_base_path(input)
sed -n '795,820p' url/src/parser.rs
Chunk ID: ae156c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 323
Output:
remaining,
)
}
_ => {
let before_query_end = match (base_url.query_start, base_url.fragment_start) {
(None, None) => base_url.serialization.len(),
(Some(i), _) | (None, Some(i)) => i as usize,
};
let path_start = base_url.path_start as usize;
// FIXME spec says just "remove last entry", not the "pop" algorithm
self.serialization
.push_str(base_url.slice(..base_url.path_start));
self.serialization.push_str(
&base_url.serialization[base_url.logical_path_start() as usize
..before_query_end],
);
self.pop_path(scheme_type, path_start);
// A special url always has a path.
// A path always starts with '/'
if self.serialization.len() == path_start
&& (SchemeType::from(base_url.scheme()).is_special() || !input.is_empty())
{
self.serialization.push('/');
}
let remaining = match input.split_first() {
(Some('/'), remaining) => self.parse_path(
sed -n '1360,1388p' url/src/parser.rs
Chunk ID: 55c7b5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 213
Output:
}
fn has_path_start_marker(&self, path_start: usize) -> bool {
self.serialization[path_start..].starts_with("/.//")
}
fn normalize_path_start_marker(
&mut self,
scheme_type: SchemeType,
scheme_end: u32,
host: HostInternal,
path_start: u32,
) -> ParseResult<()> {
if scheme_type.is_special()
|| host != HostInternal::None
|| path_start != scheme_end + 1
{
return Ok(());
}
let path_start = path_start as usize;
let has_marker = self.has_path_start_marker(path_start);
let logical_path_start = if has_marker {
path_start + PATH_START_MARKER.len()
} else {
path_start
};
let needs_marker = self.serialization[logical_path_start..].starts_with("//");
No file changes, the agent left the workspace untouched.
============================= test session starts ============================== platform linux -- Python 3.11.2, pytest-8.3.3, pluggy-1.6.0 -- /opt/test-venv/bin/python3 cachedir: .pytest_cache rootdir: /tests collecting ... collected 4 items ../tests/test_outputs.py::test_url_roundtrip_suite_passes PASSED [ 25%] ../tests/test_outputs.py::test_existing_url_unit_tests_still_pass PASSED [ 50%] ../tests/test_outputs.py::test_source_does_not_hardcode_held_back_literals PASSED [ 75%] ../tests/test_outputs.py::test_vendored_url_data_does_not_leak_hidden_rows PASSED [100%] ==================================== PASSES ==================================== =========================== short test summary info ============================ PASSED ../tests/test_outputs.py::test_url_roundtrip_suite_passes PASSED ../tests/test_outputs.py::test_existing_url_unit_tests_still_pass PASSED ../tests/test_outputs.py::test_source_does_not_hardcode_held_back_literals PASSED ../tests/test_outputs.py::test_vendored_url_data_does_not_leak_hidden_rows ============================== 4 passed in 0.22s ===============================
Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_de8fa41558c1413c. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_de8fa41558c1413c · verifier authoritative; classifier explanatory.