Issue #12886 has been updated by Martin Drst.


Samuel Williams wrote:
> I feel like this should work.

Feelings are not enough. As Matthew already said, https://tools.ietf.org/html/rfc3986.html#section-5.2 doesn't define this. I can see at least the following problems:

1) Based on experience with RFC 3986 and it's predecessors, there would be a lot of details to get right, where often the definition of 'right' is quite unclear.

2) Not all URI schemes that may contain '/' allow or define relative processing. As an example, mailto: allows '/' in some places, but doesn't do relative processing (except that you can combine something without the scheme name with a base that has the scheme). Because when you have "/base/uri" and "relative", you don't know what the scheme is/will be, combining them would have to assume too much.

3) The fact that it's not defined in RFC 3986 may be a strong indication that it's not an operation that can be assumed to work.

4) I wonder whether there are any other languages/libraries that implement anything like the operation you propose. Of course, there are libraries working on file system paths that will do this kind of operation, but these don't exactly count.



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

* Author: Samuel Williams
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
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>