|
@@ -23,8 +23,8 @@ use Url;
|
|
|
/// assert!(url.path_segments_mut().is_err());
|
|
/// assert!(url.path_segments_mut().is_err());
|
|
|
///
|
|
///
|
|
|
/// let mut url = Url::parse("http://example.net/foo/index.html").unwrap();
|
|
/// let mut url = Url::parse("http://example.net/foo/index.html").unwrap();
|
|
|
-/// url.path_segments_mut().unwrap().pop().push("img").push("100%.png");
|
|
|
|
|
-/// assert_eq!(url.as_str(), "http://example.net/foo/img/100%25.png");
|
|
|
|
|
|
|
+/// url.path_segments_mut().unwrap().pop().push("img").push("2/100%.png");
|
|
|
|
|
+/// assert_eq!(url.as_str(), "http://example.net/foo/img/2%2F100%25.png");
|
|
|
/// ```
|
|
/// ```
|
|
|
pub struct PathSegmentsMut<'a> {
|
|
pub struct PathSegmentsMut<'a> {
|
|
|
url: &'a mut Url,
|
|
url: &'a mut Url,
|
|
@@ -145,6 +145,16 @@ impl<'a> PathSegmentsMut<'a> {
|
|
|
/// url.path_segments_mut().unwrap().extend(&[org, repo, "issues", issue_number]);
|
|
/// url.path_segments_mut().unwrap().extend(&[org, repo, "issues", issue_number]);
|
|
|
/// assert_eq!(url.as_str(), "https://github.com/servo/rust-url/issues/188");
|
|
/// assert_eq!(url.as_str(), "https://github.com/servo/rust-url/issues/188");
|
|
|
/// ```
|
|
/// ```
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 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;
|
|
|
|
|
+ /// let mut url = Url::parse("https://github.com/servo").unwrap();
|
|
|
|
|
+ /// url.path_segments_mut().unwrap().extend(&["..", "rust-url", ".", "pulls"]);
|
|
|
|
|
+ /// assert_eq!(url.as_str(), "https://github.com/servo/rust-url/pulls");
|
|
|
|
|
+ /// ```
|
|
|
pub fn extend<I>(&mut self, segments: I) -> &mut Self
|
|
pub fn extend<I>(&mut self, segments: I) -> &mut Self
|
|
|
where I: IntoIterator, I::Item: AsRef<str> {
|
|
where I: IntoIterator, I::Item: AsRef<str> {
|
|
|
let scheme_type = SchemeType::from(self.url.scheme());
|
|
let scheme_type = SchemeType::from(self.url.scheme());
|
|
@@ -152,12 +162,16 @@ impl<'a> PathSegmentsMut<'a> {
|
|
|
self.url.mutate(|parser| {
|
|
self.url.mutate(|parser| {
|
|
|
parser.context = parser::Context::PathSegmentSetter;
|
|
parser.context = parser::Context::PathSegmentSetter;
|
|
|
for segment in segments {
|
|
for segment in segments {
|
|
|
|
|
+ let segment = segment.as_ref();
|
|
|
|
|
+ if matches!(segment, "." | "..") {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
if parser.serialization.len() > path_start + 1 {
|
|
if parser.serialization.len() > path_start + 1 {
|
|
|
parser.serialization.push('/');
|
|
parser.serialization.push('/');
|
|
|
}
|
|
}
|
|
|
let mut has_host = true; // FIXME account for this?
|
|
let mut has_host = true; // FIXME account for this?
|
|
|
parser.parse_path(scheme_type, &mut has_host, path_start,
|
|
parser.parse_path(scheme_type, &mut has_host, path_start,
|
|
|
- parser::Input::new(segment.as_ref()));
|
|
|
|
|
|
|
+ parser::Input::new(segment));
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
self
|
|
self
|