From: samuel@... Date: 2017-04-17T06:46:14+00:00 Subject: [ruby-core:80721] [Ruby trunk Feature#12886] URI#merge doesn't handle paths correctly 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") => # 2.4.0 :006 > Addressable::URI.parse("/foo/bar") + "/baz" => # 2.4.0 :007 > Addressable::URI.parse("/foo/bar") + "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: