Issue #12886 has been updated by Matthew Kerwin. This ticket should be re-cast as a feature request, to allow merging of two relative references. Incidentally: Samuel Williams wrote: > > [...] I'd like to state that `URI("a/c")` is actually a valid URI. > As discussed elsewhere, it's a "relative reference", not a "URI." It parses to a `URI::Generic` object for pragmatic reasons. > > So, it's purely the `merge` function being to limited in what it will handle for no obvious reason. > Except for Internet Standard 66 (RFC 3986), section 5.1 of which says "*The term "relative" implies that a "base URI" exists against which the relative reference is applied. Aside from fragment-only references, relative references are only usable when a base URI is known.*" You have two relative references, not a (base) URI and a relative reference. > > Situations where this comes up: parsing a website which contains relative URLS, and you want to construct absolute URLs. > Except that this doesn't construct absolute URLs, it constructs different relative references. ---------------------------------------- Bug #12886: URI#merge doesn't handle paths correctly https://bugs.ruby-lang.org/issues/12886#change-61124 * Author: Samuel Williams * Status: Open * Priority: Normal * Assignee: * ruby -v: * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- 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>