From: "marcandre (Marc-Andre Lafortune)" Date: 2012-06-14T11:33:27+09:00 Subject: [ruby-core:45639] [Archive91 - Backport #3505][Closed] URI.join and Kernel::URI should accept URI objects Issue #3505 has been updated by marcandre (Marc-Andre Lafortune). Description updated Status changed from Assigned to Closed ---------------------------------------- Backport #3505: URI.join and Kernel::URI should accept URI objects https://bugs.ruby-lang.org/issues/3505#change-27236 Author: marcandre (Marc-Andre Lafortune) Status: Closed Priority: Normal Assignee: yugui (Yuki Sonoda) Category: lib Target version: =begin URI.join accepts strings or URI objects, except for the first parameter which must be a string: rubydev -r uri -e 'p URI.join("http://ruby-lang.org", URI("/foo"))' # rubydev -r uri -e 'p URI.join(URI("http://ruby-lang.org"), "/foo")' /usr/local/rubydev/lib/ruby/1.9.1/uri/common.rb:156:in `split': bad URI(is not URI?): http://ruby-lang.org (URI::InvalidURIError) I believe it should accept URI object as first parameter too. Also, Kernel::URI accept uri strings, but not URI objects: rubydev -r uri -e 'URI(URI("http://ruby-lang.org"))' /usr/local/rubydev/lib/ruby/1.9.1/uri/common.rb:156:in `split': bad URI(is not URI?): http://ruby-lang.org (URI::InvalidURIError) This corresponds to the documentation, but it is contrary to Kernel::String, Integer, Float, etc... that all accept their own type. The error message is clearly buggy (an URI object is not an invalid uri!). I believe that Kernel::URI should accept URI objects (and return them). The patch below corrects both and has no impact on test-all nor rubyspec. I plan to commit it unless there is objection. Yugui: should I commit it in the 1.9.2 branch too? Thanks diff --git a/lib/uri/common.rb b/lib/uri/common.rb index 58fd422..bda6718 100644 --- a/lib/uri/common.rb +++ b/lib/uri/common.rb @@ -184,12 +184,16 @@ module URI end end - def join(*str) - u = self.parse(str[0]) - str[1 .. -1].each do |x| - u = u.merge(x) + def join(*uris) + case uris[0] + when Generic + when String + uris[0] = self.parse(uris[0]) + else + raise ArgumentError, + "bad argument (expected URI object or URI string)" end - u + uris.inject :merge end def extract(str, schemes = nil, &block) @@ -837,11 +841,20 @@ module URI end module Kernel - # alias for URI.parse. + # - # This method is introduced at 1.8.2. - def URI(uri_str) # :doc: - URI.parse(uri_str) + # Returns +uri+ converted to a URI object. + # + def URI(uri) + case uri + when URI::Generic + uri + when String + URI.parse(uri) + else + raise ArgumentError, + "bad argument (expected URI object or URI string)" + end end module_function :URI end =end -- http://bugs.ruby-lang.org/