Issue #12886 has been updated by ioquatix (Samuel Williams).


> I wonder whether there are any other languages/libraries that implement anything like the operation you propose.

This use case is already working in `addressable` gem:

~~~ruby
2.4.0 :005 > Addressable::URI.parse("/foo/bar")
 => #<Addressable::URI:0x3fd99b4c0ba8 URI:/foo/bar> 
2.4.0 :006 > Addressable::URI.parse("/foo/bar") + "/baz"
 => #<Addressable::URI:0x3fd99b4b95ec URI:/baz> 
2.4.0 :007 > Addressable::URI.parse("/foo/bar") + "baz"
 => #<Addressable::URI:0x3fd99b4b1fcc URI:/foo/baz> 
~~~

An actual use case is parsing URIs in an HTML document with a base URI and relative URIs. It should be possible to use the URI class to correctly produce valid URIs, IMHO. The operation should be something like:

~~~ruby
base_uri = URI(base[:href]) # may be relative reference
a_href = base_uri + a[:href]
~~~

----------------------------------------
Feature #12886: URI#merge doesn't handle paths correctly
https://bugs.ruby-lang.org/issues/12886#change-64272

* Author: ioquatix (Samuel Williams)
* Status: Rejected
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
I feel like this should work.

~~~
> URI.parse("/base/uri") + URI.parse("relative")
URI::BadURIError: both URI are relative
~~~

The result should be URI with path = "/base/relative".

But it doesn't. It fails with an exception.

There are two ways to fix this. The first is to change the meaning of `URI#absolute?` to relate to the absoluteness of the path, not whether or not there is a scheme.

The second way to fix this is to directly work around the issue in `merge`.

In my opinion

~~~
> URI.parse("a/b") + URI.parse("c")
URI::BadURIError: both URI are relative
~~~

should also work, with a result of "a/c".

The need for the LHS of the operation to contain a scheme is not a useful requirement in practice, and in addition, I'd like to state that `URI("a/c")` is actually a valid URI. So, it's purely the `merge` function being to limited in what it will handle for no obvious reason.

Situations where this comes up: parsing a website which contains relative URLS, and you want to construct absolute URLs.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>