Backport #3505
Updated by marcandre (Marc-Andre Lafortune) almost 12 years ago
=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"))' #<URI::HTTP:0x0000010109b418 URL:http://ruby-lang.org/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