diff options
author | gsinclair <gsinclair@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-03-24 11:53:31 +0000 |
---|---|---|
committer | gsinclair <gsinclair@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-03-24 11:53:31 +0000 |
commit | 42ad5216ec57a5890eb20230efb09e1aa53ed528 (patch) | |
tree | e165885640ee8aee2f1b0c76d5a295acb75430c9 /lib/uri/generic.rb | |
parent | 5e23ff603f53c99ac45e331e24498bfa124b4d72 (diff) | |
download | ruby-42ad5216ec57a5890eb20230efb09e1aa53ed528.tar.gz |
* lib/uri.rb: Documented (thanks Dmitry V. Sabanin).
* lib/uri/common.rb: Ditto.
* lib/uri/ftp.rb: Ditto.
* lib/uri/generic.rb: Ditto.
* lib/uri/http.rb: Ditto.
* lib/uri/https.rb: Ditto.
* lib/uri/ldap.rb: Ditto.
* lib/uri/mailto.rb: Ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/uri/generic.rb')
-rw-r--r-- | lib/uri/generic.rb | 961 |
1 files changed, 459 insertions, 502 deletions
diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb index c1d0d63cae..aebb924e85 100644 --- a/lib/uri/generic.rb +++ b/lib/uri/generic.rb @@ -1,37 +1,27 @@ # -# $Id$ +# = uri/generic.rb # -# Copyright (c) 2001 akira yamada <akira@ruby-lang.org> -# You can redistribute it and/or modify it under the same term as Ruby. +# Author:: Akira Yamada <akira@ruby-lang.org> +# License:: You can redistribute it and/or modify it under the same term as Ruby. +# Revision:: $Id$ # require 'uri/common' module URI - -=begin - -== URI::Generic - -=== Super Class - -Object - -=end - + + # + # Base class for all URI classes. + # class Generic include URI include REGEXP -=begin - -=== Class Methods - ---- URI::Generic::default_port - -=end DEFAULT_PORT = nil + # + # Returns default port + # def self.default_port self::DEFAULT_PORT end @@ -40,9 +30,6 @@ Object self.class.default_port end -=begin ---- URI::Generic::component -=end COMPONENT = [ :scheme, :userinfo, :host, :port, :registry, @@ -51,90 +38,126 @@ Object :fragment ].freeze + # + # Components of the URI in the order. + # def self.component self::COMPONENT end -=begin ---- URI::Generic::use_registry -=end USE_REGISTRY = false + # + # DOC: FIXME! + # def self.use_registry self::USE_REGISTRY end -=begin - ---- URI::Generic::build2 - At first, try to create a new URI::Generic object using - URI::Generic::build. But, if you get a exception - URI::InvalidComponentError, then re-try to create an object with - escaped components. - ---- URI::Generic::build - Create a new URI::Generic object from components of URI::Generic - with check. It is scheme, userinfo, host, port, registry, path, - opaque, query and fragment. It provided by an Array of a Hash. - ---- URI::Generic::new - Create new URI::Generic object from ``generic'' components with no - check. - -=end + # + # == Synopsis + # + # See #new + # + # == Description + # + # At first, tries to create a new URI::Generic instance using + # URI::Generic::build. But, if exception URI::InvalidComponentError is raised, + # then it URI::Escape.escape all URI components and tries again. + # + # def self.build2(args) begin - return self.build(args) + return self.build(args) rescue InvalidComponentError - if args.kind_of?(Array) - return self.build(args.collect{|x| - if x - URI.escape(x) - else - x - end - }) - elsif args.kind_of?(Hash) - tmp = {} - args.each do |key, value| - tmp[key] = if value - URI.escape(value) - else - value - end - end - return self.build(tmp) - end + if args.kind_of?(Array) + return self.build(args.collect{|x| + if x + URI.escape(x) + else + x + end + }) + elsif args.kind_of?(Hash) + tmp = {} + args.each do |key, value| + tmp[key] = if value + URI.escape(value) + else + value + end + end + return self.build(tmp) + end end end + # + # == Synopsis + # + # See #new + # + # == Description + # + # Creates a new URI::Generic instance from components of URI::Generic + # with check. Components are: scheme, userinfo, host, port, registry, path, + # opaque, query and fragment. You can provide arguments either by an Array or a Hash. + # See #new for hash keys to use or for order of array items. + # def self.build(args) if args.kind_of?(Array) && - args.size == ::URI::Generic::COMPONENT.size - tmp = args + args.size == ::URI::Generic::COMPONENT.size + tmp = args elsif args.kind_of?(Hash) - tmp = ::URI::Generic::COMPONENT.collect do |c| - if args.include?(c) - args[c] - else - nil - end - end + tmp = ::URI::Generic::COMPONENT.collect do |c| + if args.include?(c) + args[c] + else + nil + end + end else - raise ArgumentError, - "expected Array of or Hash of components of #{self.class} (#{self.class.component.join(', ')})" + raise ArgumentError, + "expected Array of or Hash of components of #{self.class} (#{self.class.component.join(', ')})" end tmp << true return self.new(*tmp) end - + # + # == Args + # + # +scheme+:: + # Protocol scheme, i.e. 'http','ftp','mailto' and so on. + # +userinfo+:: + # User name and password, i.e. 'sdmitry:bla' + # +host+:: + # Server host name + # +port+:: + # Server port + # +registry+:: + # DOC: FIXME! + # +path+:: + # Path on server + # +opaque+:: + # DOC: FIXME! + # +query+:: + # Query data + # +fragment+:: + # A part of URI after '#' sign + # +arg_check+:: + # Check arguments [false by default] + # + # == Description + # + # Creates a new URI::Generic instance from ``generic'' components without check. + # def initialize(scheme, - userinfo, host, port, registry, - path, opaque, - query, - fragment, - arg_check = false) + userinfo, host, port, registry, + path, opaque, + query, + fragment, + arg_check = false) @scheme = nil @user = nil @password = nil @@ -147,28 +170,29 @@ Object @fragment = nil if arg_check - self.scheme = scheme - self.userinfo = userinfo - self.host = host - self.port = port - self.path = path - self.query = query - self.opaque = opaque - self.registry = registry - self.fragment = fragment + self.scheme = scheme + self.userinfo = userinfo + self.host = host + self.port = port + self.path = path + self.query = query + self.opaque = opaque + self.registry = registry + self.fragment = fragment else - self.set_scheme(scheme) - self.set_userinfo(userinfo) - self.set_host(host) - self.set_port(port) - self.set_path(path) - self.set_query(query) - self.set_opaque(opaque) - self.set_registry(registry) - self.set_fragment(fragment) + self.set_scheme(scheme) + self.set_userinfo(userinfo) + self.set_host(host) + self.set_port(port) + self.set_path(path) + self.set_query(query) + self.set_opaque(opaque) + self.set_registry(registry) + self.set_fragment(fragment) end if @registry && !self.class.use_registry - raise InvalidURIError, "the scheme #{@scheme} does not accept registry part: #{@registry} (or bad hostname?)" + raise InvalidURIError, + "the scheme #{@scheme} does not accept registry part: #{@registry} (or bad hostname?)" end @scheme.freeze if @scheme @@ -187,48 +211,23 @@ Object # replace self by other URI object def replace!(oth) if self.class != oth.class - raise ArgumentError, "expected #{self.class} object" + raise ArgumentError, "expected #{self.class} object" end component.each do |c| - self.__send__("#{c}=", oth.__send__(c)) + self.__send__("#{c}=", oth.__send__(c)) end end private :replace! -=begin - -=== Instance Methods - -=end - -=begin - ---- URI::Generic#component - -=end def component self.class.component end - # set_XXX method sets value to @XXX instance variable with no check, - # so be careful if you use these methods. or, you use these method - # with check_XXX method, or you use XXX= methods. - -=begin - ---- URI::Generic#scheme - ---- URI::Generic#scheme=(v) - -=end - # - # methods for scheme - # def check_scheme(v) if v && SCHEME !~ v - raise InvalidComponentError, - "bad component(expected scheme component): #{v}" + raise InvalidComponentError, + "bad component(expected scheme component): #{v}" end return true @@ -246,27 +245,9 @@ Object v end -=begin - ---- URI::Generic#userinfo - ---- URI::Generic#userinfo=(v) - ---- URI::Generic#user - ---- URI::Generic#user=(v) - ---- URI::Generic#password - ---- URI::Generic#password=(v) - -=end - # - # methods for userinfo - # def check_userinfo(user, password = nil) if !password - user, password = split_userinfo(user) + user, password = split_userinfo(user) end check_user(user) check_password(password, user) @@ -277,15 +258,15 @@ Object def check_user(v) if @registry || @opaque - raise InvalidURIError, - "can not set user with registry or opaque" + raise InvalidURIError, + "can not set user with registry or opaque" end return v unless v if USERINFO !~ v - raise InvalidComponentError, - "bad component(expected userinfo component or user component): #{v}" + raise InvalidComponentError, + "bad component(expected userinfo component or user component): #{v}" end return true @@ -294,28 +275,31 @@ Object def check_password(v, user = @user) if @registry || @opaque - raise InvalidURIError, - "can not set password with registry or opaque" + raise InvalidURIError, + "can not set password with registry or opaque" end return v unless v if !user - raise InvalidURIError, - "password component depends user component" + raise InvalidURIError, + "password component depends user component" end if USERINFO !~ v - raise InvalidComponentError, - "bad component(expected user component): #{v}" + raise InvalidComponentError, + "bad component(expected user component): #{v}" end return true end private :check_password + # + # Sets userinfo, argument is string like 'name:pass' + # def userinfo=(userinfo) if userinfo.nil? - return nil + return nil end check_userinfo(*userinfo) set_userinfo(*userinfo) @@ -327,7 +311,7 @@ Object set_user(user) user end - + def password=(password) check_password(password) set_password(password) @@ -336,7 +320,7 @@ Object def set_userinfo(user, password = nil) unless password - user, password = split_userinfo(user) + user, password = split_userinfo(user) end @user = user @password = password if password @@ -361,11 +345,11 @@ Object return nil, nil unless ui tmp = ui.index(':') if tmp - user = ui[0..tmp - 1] - password = ui[tmp + 1..-1] + user = ui[0..tmp - 1] + password = ui[tmp + 1..-1] else - user = ui - password = nil + user = ui + password = nil end return user, password @@ -379,9 +363,9 @@ Object def userinfo if !@password - @user + @user else - @user + ':' + @password + @user + ':' + @password end end @@ -393,26 +377,15 @@ Object @password end -=begin - ---- URI::Generic#host - ---- URI::Generic#host=(v) - -=end - # - # methods for host - # - def check_host(v) return v unless v if @registry || @opaque - raise InvalidURIError, - "can not set host with registry or opaque" + raise InvalidURIError, + "can not set host with registry or opaque" elsif HOST !~ v - raise InvalidComponentError, - "bad component(expected host component): #{v}" + raise InvalidComponentError, + "bad component(expected host component): #{v}" end return true @@ -430,26 +403,15 @@ Object v end -=begin - ---- URI::Generic#port - ---- URI::Generic#port=(v) - -=end - # - # methods for port - # - def check_port(v) return v unless v if @registry || @opaque - raise InvalidURIError, - "can not set port with registry or opaque" + raise InvalidURIError, + "can not set port with registry or opaque" elsif !v.kind_of?(Fixnum) && PORT !~ v - raise InvalidComponentError, - "bad component(expected port component): #{v}" + raise InvalidComponentError, + "bad component(expected port component): #{v}" end return true @@ -458,11 +420,11 @@ Object def set_port(v) unless !v || v.kind_of?(Fixnum) - if v.empty? - v = nil - else - v = v.to_i - end + if v.empty? + v = nil + else + v = v.to_i + end end @port = v end @@ -474,17 +436,6 @@ Object port end -=begin - ---- URI::Generic#registry - ---- URI::Generic#registry=(v) - -=end - # - # methods for registry - # - def check_registry(v) return v unless v @@ -492,11 +443,11 @@ Object # authority = server | reg_name # server = [ [ userinfo "@" ] hostport ] if @host || @port || @user # userinfo = @user + ':' + @password - raise InvalidURIError, - "can not set registry with host, port, or userinfo" + raise InvalidURIError, + "can not set registry with host, port, or userinfo" elsif v && REGISTRY !~ v - raise InvalidComponentError, - "bad component(expected registry component): #{v}" + raise InvalidComponentError, + "bad component(expected registry component): #{v}" end return true @@ -514,36 +465,25 @@ Object v end -=begin - ---- URI::Generic#path - ---- URI::Generic#path=(v) - -=end - # - # methods for path - # - def check_path(v) # raise if both hier and opaque are not nil, because: # absoluteURI = scheme ":" ( hier_part | opaque_part ) # hier_part = ( net_path | abs_path ) [ "?" query ] if v && @opaque - raise InvalidURIError, - "path conflicts with opaque" + raise InvalidURIError, + "path conflicts with opaque" end if @scheme - if v && v != '' && ABS_PATH !~ v - raise InvalidComponentError, - "bad component(expected absolute path component): #{v}" - end + if v && v != '' && ABS_PATH !~ v + raise InvalidComponentError, + "bad component(expected absolute path component): #{v}" + end else - if v && v != '' && ABS_PATH !~ v && REL_PATH !~ v - raise InvalidComponentError, - "bad component(expected relative path component): #{v}" - end + if v && v != '' && ABS_PATH !~ v && REL_PATH !~ v + raise InvalidComponentError, + "bad component(expected relative path component): #{v}" + end end return true @@ -561,17 +501,6 @@ Object v end -=begin - ---- URI::Generic#query - ---- URI::Generic#query=(v) - -=end - # - # methods for query - # - def check_query(v) return v unless v @@ -579,14 +508,14 @@ Object # absoluteURI = scheme ":" ( hier_part | opaque_part ) # hier_part = ( net_path | abs_path ) [ "?" query ] if @opaque - raise InvalidURIError, - "query conflicts with opaque" + raise InvalidURIError, + "query conflicts with opaque" end if v && v != '' && QUERY !~ v - raise InvalidComponentError, - "bad component(expected query component): #{v}" - end + raise InvalidComponentError, + "bad component(expected query component): #{v}" + end return true end @@ -603,17 +532,6 @@ Object v end -=begin - ---- URI::Generic#opaque - ---- URI::Generic#opaque=(v) - -=end - # - # methods for opaque - # - def check_opaque(v) return v unless v @@ -621,11 +539,11 @@ Object # absoluteURI = scheme ":" ( hier_part | opaque_part ) # hier_part = ( net_path | abs_path ) [ "?" query ] if @host || @port || @user || @path # userinfo = @user + ':' + @password - raise InvalidURIError, - "can not set opaque with host, port, userinfo or path" + raise InvalidURIError, + "can not set opaque with host, port, userinfo or path" elsif v && OPAQUE !~ v - raise InvalidComponentError, - "bad component(expected opaque component): #{v}" + raise InvalidComponentError, + "bad component(expected opaque component): #{v}" end return true @@ -643,23 +561,12 @@ Object v end -=begin - ---- URI::Generic#fragment - ---- URI::Generic#fragment=(v) - -=end - # - # methods for fragment - # - def check_fragment(v) return v unless v if v && v != '' && FRAGMENT !~ v - raise InvalidComponentError, - "bad component(expected fragment component): #{v}" + raise InvalidComponentError, + "bad component(expected fragment component): #{v}" end return true @@ -677,49 +584,36 @@ Object v end -=begin - ---- URI::Generic#hierarchical? - -=end + # + # Checks if URI has a path + # def hierarchical? if @path - true + true else - false + false end end -=begin - ---- URI::Generic#absolute? - -=end + # + # Checks if URI is an absolute one + # def absolute? if @scheme - true + true else - false + false end end alias absolute absolute? -=begin - ---- URI::Generic#relative? - -=end + # + # Checks if URI is relative + # def relative? !absolute? end -=begin - ---- URI::Generic#merge(rel) ---- URI::Generic#merge!(rel) ---- URI::Generic#+(rel) - -=end def split_path(path) path.split(%r{/+}, -1) end @@ -728,85 +622,121 @@ Object def merge_path(base, rel) # RFC2396, Section 5.2, 5) if rel[0] == ?/ #/ - # RFC2396, Section 5.2, 5) - return rel + # RFC2396, Section 5.2, 5) + return rel else - # RFC2396, Section 5.2, 6) - base_path = split_path(base) - rel_path = split_path(rel) - - if base_path.empty? - base_path = [''] # XXX - end - - # RFC2396, Section 5.2, 6), a) - base_path.pop unless base_path.size == 1 - - # RFC2396, Section 5.2, 6), c) - # RFC2396, Section 5.2, 6), d) - rel_path.push('') if rel_path.last == '.' - rel_path.delete('.') - - # RFC2396, Section 5.2, 6), e) - tmp = [] - rel_path.each do |x| - if x == '..' && - !(tmp.empty? || tmp.last == '..') - tmp.pop - else - tmp << x - end - end - - add_trailer_slash = true - while x = tmp.shift - if x == '..' && base_path.size > 1 - # RFC2396, Section 4 - # a .. or . in an absolute path has no special meaning - base_path.pop - else - # if x == '..' - # valid absolute (but abnormal) path "/../..." - # else - # valid absolute path - # end - base_path << x - tmp.each {|t| base_path << t} - add_trailer_slash = false - break - end - end - base_path.push('') if add_trailer_slash - - return base_path.join('/') + # RFC2396, Section 5.2, 6) + base_path = split_path(base) + rel_path = split_path(rel) + + if base_path.empty? + base_path = [''] # XXX + end + + # RFC2396, Section 5.2, 6), a) + base_path.pop unless base_path.size == 1 + + # RFC2396, Section 5.2, 6), c) + # RFC2396, Section 5.2, 6), d) + rel_path.push('') if rel_path.last == '.' + rel_path.delete('.') + + # RFC2396, Section 5.2, 6), e) + tmp = [] + rel_path.each do |x| + if x == '..' && + !(tmp.empty? || tmp.last == '..') + tmp.pop + else + tmp << x + end + end + + add_trailer_slash = true + while x = tmp.shift + if x == '..' && base_path.size > 1 + # RFC2396, Section 4 + # a .. or . in an absolute path has no special meaning + base_path.pop + else + # if x == '..' + # valid absolute (but abnormal) path "/../..." + # else + # valid absolute path + # end + base_path << x + tmp.each {|t| base_path << t} + add_trailer_slash = false + break + end + end + base_path.push('') if add_trailer_slash + + return base_path.join('/') end end private :merge_path + # + # == Args + # + # +oth+:: + # URI or String + # + # == Description + # + # Destructive form of #merge + # + # == Usage + # + # require 'uri' + # + # uri = URI.parse("http://my.rubysite.com") + # uri.merge!("/main.rbx?page=1") + # p uri + # # => #<URI::HTTP:0x2021f3b0 URL:http://my.rubysite.com/main.rbx?page=1> + # def merge!(oth) t = merge(oth) if self == t - nil + nil else - replace!(t) - self + replace!(t) + self end end - # abs(self) + rel(oth) => abs(new) + # + # == Args + # + # +oth+:: + # URI or String + # + # == Description + # + # Merges two URI's. + # + # == Usage + # + # require 'uri' + # + # uri = URI.parse("http://my.rubysite.com") + # p uri.merge("/main.rbx?page=1") + # # => #<URI::HTTP:0x2021f3b0 URL:http://my.rubysite.com/main.rbx?page=1> + # def merge(oth) base, rel = merge0(oth) if base == rel - return base + return base end authority = rel.userinfo || rel.host || rel.port # RFC2396, Section 5.2, 2) if rel.path.empty? && !authority && !rel.query - base.set_fragment(rel.fragment) if rel.fragment - return base + base.set_fragment(rel.fragment) if rel.fragment + return base end base.set_query(nil) @@ -814,10 +744,10 @@ Object # RFC2396, Section 5.2, 4) if !authority - base.set_path(merge_path(base.path, rel.path)) + base.set_path(merge_path(base.path, rel.path)) else - # RFC2396, Section 5.2, 4) - base.set_path(rel.path) + # RFC2396, Section 5.2, 4) + base.set_path(rel.path) end # RFC2396, Section 5.2, 7) @@ -837,46 +767,40 @@ Object case oth when Generic when String - oth = URI.parse(oth) + oth = URI.parse(oth) else - raise ArgumentError, - "bad argument(expected URI object or URI string)" + raise ArgumentError, + "bad argument(expected URI object or URI string)" end if self.relative? && oth.relative? - raise BadURIError, - "both URI are relative" + raise BadURIError, + "both URI are relative" end if self.absolute? && oth.absolute? - #raise BadURIError, - # "both URI are absolute" - # hmm... should return oth for usability? - return oth, oth + #raise BadURIError, + # "both URI are absolute" + # hmm... should return oth for usability? + return oth, oth end if !self.hierarchical? - raise BadURIError, - "not hierarchical URI: #{self}" + raise BadURIError, + "not hierarchical URI: #{self}" elsif !oth.hierarchical? - raise BadURIError, - "not hierarchical URI: #{oth}" + raise BadURIError, + "not hierarchical URI: #{oth}" end if self.absolute? - return self.dup, oth + return self.dup, oth else - return oth, oth + return oth, oth end end private :merge0 -=begin - ---- URI::Generic#route_from(src) ---- URI::Generic#-(src) - -=end def route_from_path(src, dst) # RFC2396, Section 4.2 return '' if src == dst @@ -887,31 +811,31 @@ Object # hmm... dst has abnormal absolute path, # like "/./", "/../", "/x/../", ... if dst_path.include?('..') || - dst_path.include?('.') - return dst.dup + dst_path.include?('.') + return dst.dup end src_path.pop # discard same parts while dst_path.first == src_path.first - break if dst_path.empty? + break if dst_path.empty? - src_path.shift - dst_path.shift + src_path.shift + dst_path.shift end tmp = dst_path.join('/') # calculate if src_path.empty? - if tmp.empty? - return './' - elsif dst_path.first.include?(':') # (see RFC2396 Section 5) - return './' + tmp - else - return tmp - end + if tmp.empty? + return './' + elsif dst_path.first.include?(':') # (see RFC2396 Section 5) + return './' + tmp + else + return tmp + end end return '../' * src_path.size + tmp @@ -922,179 +846,202 @@ Object case oth when Generic when String - oth = URI.parse(oth) + oth = URI.parse(oth) else - raise ArgumentError, - "bad argument(expected URI object or URI string)" + raise ArgumentError, + "bad argument(expected URI object or URI string)" end if self.relative? - raise BadURIError, - "relative URI: #{self}" + raise BadURIError, + "relative URI: #{self}" end if oth.relative? - raise BadURIError, - "relative URI: #{oth}" + raise BadURIError, + "relative URI: #{oth}" end if !self.hierarchical? || !oth.hierarchical? - return self, self.dup + return self, self.dup end if self.scheme != oth.scheme - return oth, oth.dup + return oth, oth.dup end rel = URI::Generic.new(nil, # it is relative URI - self.userinfo, self.host, self.port, - self.registry, self.path, self.opaque, - self.query, self.fragment) + self.userinfo, self.host, self.port, + self.registry, self.path, self.opaque, + self.query, self.fragment) if rel.userinfo != oth.userinfo || - rel.host.to_s.downcase != oth.host.to_s.downcase || - rel.port != oth.port - rel.set_port(nil) if rel.port == oth.default_port - return rel, rel + rel.host.to_s.downcase != oth.host.to_s.downcase || + rel.port != oth.port + rel.set_port(nil) if rel.port == oth.default_port + return rel, rel end rel.set_userinfo(nil) rel.set_host(nil) rel.set_port(nil) if rel.path == oth.path - rel.set_path('') - rel.set_query(nil) if rel.query == oth.query - return rel, rel + rel.set_path('') + rel.set_query(nil) if rel.query == oth.query + return rel, rel end # you can modify `rel', but can not `oth'. return oth, rel end private :route_from0 - - # calculate relative path from oth to self + # + # == Args + # + # +oth+:: + # URI or String + # + # == Description + # + # Calculates relative path from oth to self + # + # == Usage + # + # require 'uri' + # + # uri = URI.parse('http://my.rubysite.com/main.rbx?page=1') + # p uri.route_from('http://my.rubysite.com') + # #=> #<URI::Generic:0x20218858 URL:/main.rbx?page=1> + # def route_from(oth) # you can modify `rel', but can not `oth'. oth, rel = route_from0(oth) if oth == rel - return rel + return rel end rel.set_path(route_from_path(oth.path, self.path)) if rel.path == './' && self.query - # "./?foo" -> "?foo" - rel.set_path('') + # "./?foo" -> "?foo" + rel.set_path('') end return rel end - # abs1 - abs2 => relative_path_to_abs1_from_abs2 - # (see http://www.nikonet.or.jp/spring/what_v/what_v_4.htm :-) - alias - route_from -=begin - ---- URI::Generic#route_to(dst) + alias - route_from -=end - # calculate relative path to oth from self + # + # == Args + # + # +oth+:: + # URI or String + # + # == Description + # + # Calculates relative path to oth from self + # + # == Usage + # + # require 'uri' + # + # uri = URI.parse('http://my.rubysite.com') + # p uri.route_to('http://my.rubysite.com/main.rbx?page=1') + # #=> #<URI::Generic:0x2020c2f6 URL:/main.rbx?page=1> + # def route_to(oth) case oth when Generic when String - oth = URI.parse(oth) + oth = URI.parse(oth) else - raise ArgumentError, - "bad argument(expected URI object or URI string)" + raise ArgumentError, + "bad argument(expected URI object or URI string)" end oth.route_from(self) end -=begin - ---- URI::Generic#normalize ---- URI::Generic#normalize! - -=end + # + # Returns normalized URI + # def normalize uri = dup uri.normalize! uri end + # + # Destructive version of #normalize + # def normalize! if path && path == '' - set_path('/') + set_path('/') end if host && host != host.downcase - set_host(self.host.downcase) - end + set_host(self.host.downcase) + end end -=begin - ---- URI::Generic#to_s - -=end def path_query str = @path if @query - str += '?' + @query + str += '?' + @query end str end private :path_query + # + # Constructs String from URI + # def to_s str = '' if @scheme - str << @scheme - str << ':' + str << @scheme + str << ':' end if @opaque - str << @opaque + str << @opaque else - if @registry - str << @registry - else - if @host - str << '//' - end - if self.userinfo - str << self.userinfo - str << '@' - end - if @host - str << @host - end - if @port && @port != self.default_port - str << ':' - str << @port.to_s - end - end - - str << path_query + if @registry + str << @registry + else + if @host + str << '//' + end + if self.userinfo + str << self.userinfo + str << '@' + end + if @host + str << @host + end + if @port && @port != self.default_port + str << ':' + str << @port.to_s + end + end + + str << path_query end if @fragment - str << '#' - str << @fragment + str << '#' + str << @fragment end str end -=begin - ---- URI::Generic#==(oth) - -=end + # + # Compares to URI's + # def ==(oth) if self.class == oth.class - self.normalize.component_ary == oth.normalize.component_ary + self.normalize.component_ary == oth.normalize.component_ary else - false + false end end @@ -1111,42 +1058,52 @@ Object =end def component_ary component.collect do |x| - self.send(x) + self.send(x) end end protected :component_ary -=begin ---- URI::Generic#select(*components) -=end + # == Args + # + # +components+:: + # Multiple Symbol arguments defined in URI::HTTP + # + # == Description + # + # Selects specified components from URI + # + # == Usage + # + # require 'uri' + # + # uri = URI.parse('http://myuser:mypass@my.rubysite.com/test.rbx') + # p uri.select(:userinfo, :host, :path) + # # => ["myuser:mypass", "my.rubysite.com", "/test.rbx"] + # def select(*components) components.collect do |c| - if component.include?(c) - self.send(c) - else - raise ArgumentError, - "expected of components of #{self.class} (#{self.class.component.join(', ')})" - end + if component.include?(c) + self.send(c) + else + raise ArgumentError, + "expected of components of #{self.class} (#{self.class.component.join(', ')})" + end end end -=begin -=end def inspect sprintf("#<%s:0x%x URL:%s>", self.class.to_s, self.object_id, self.to_s) end -=begin -=end def coerce(oth) case oth when String - oth = URI.parse(oth) + oth = URI.parse(oth) else - super + super end return oth, self end - end # Generic -end # URI + end +end |