Issue #12886 has been updated by duerst (Martin Drst).


naruse (Yui NARUSE) wrote:
> [URL Standard](https://url.spec.whatwg.org/) defines partially merging, but it is base (absolute URL) + relative as you may know.

Which is exactly the same in RFC 3986.

> And the base URL must be absolute.
> You need to make absolute URI from request or something before join.

In other words, in the end, only absolute URIs are actionable. So we need an absolute URI eventually. The way relative resolution is defined, this means that if we have `absolute + relative1 + relative2`, this is interpreted as `(absolute + relative1) + relative2`. If we could guarantee that `(absolute + relative1) + relative2 == absolute + (relative1 + relative2)`, then we might implement the "relative + relative" case. But proving this equivalence might turn out to be quite hard.

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

* 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>