Bug #1787 » lib_uri_common-r3.patch
| lib/uri/common.rb (作業コピー) | ||
|---|---|---|
|
def split(uri)
|
||
|
case uri
|
||
|
when ''
|
||
|
# null uri
|
||
|
# null uri
|
||
|
when @regexp[:ABS_URI]
|
||
|
scheme, opaque, userinfo, host, port,
|
||
|
registry, path, query, fragment = $~[1..-1]
|
||
|
scheme, opaque, userinfo, host, port,
|
||
|
registry, path, query, fragment = $~[1..-1]
|
||
|
# URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||
|
# URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||
|
# absoluteURI = scheme ":" ( hier_part | opaque_part )
|
||
|
# hier_part = ( net_path | abs_path ) [ "?" query ]
|
||
|
# opaque_part = uric_no_slash *uric
|
||
|
# abs_path = "/" path_segments
|
||
|
# net_path = "//" authority [ abs_path ]
|
||
|
# authority = server | reg_name
|
||
|
# server = [ [ userinfo "@" ] hostport ]
|
||
|
if !scheme
|
||
|
raise InvalidURIError,
|
||
|
"bad URI(absolute but no scheme): #{uri}"
|
||
|
end
|
||
|
if !opaque && (!path && (!host && !registry))
|
||
|
raise InvalidURIError,
|
||
|
"bad URI(absolute but no path): #{uri}"
|
||
|
end
|
||
|
# absoluteURI = scheme ":" ( hier_part | opaque_part )
|
||
|
# hier_part = ( net_path | abs_path ) [ "?" query ]
|
||
|
# opaque_part = uric_no_slash *uric
|
||
|
# abs_path = "/" path_segments
|
||
|
# net_path = "//" authority [ abs_path ]
|
||
|
# authority = server | reg_name
|
||
|
# server = [ [ userinfo "@" ] hostport ]
|
||
|
if !scheme
|
||
|
raise InvalidURIError,
|
||
|
"bad URI(absolute but no scheme): #{uri}"
|
||
|
end
|
||
|
if !opaque && (!path && (!host && !registry))
|
||
|
raise InvalidURIError,
|
||
|
"bad URI(absolute but no path): #{uri}"
|
||
|
end
|
||
|
when @regexp[:REL_URI]
|
||
|
scheme = nil
|
||
|
opaque = nil
|
||
|
scheme = nil
|
||
|
opaque = nil
|
||
|
userinfo, host, port, registry,
|
||
|
rel_segment, abs_path, query, fragment = $~[1..-1]
|
||
|
if rel_segment && abs_path
|
||
|
path = rel_segment + abs_path
|
||
|
elsif rel_segment
|
||
|
path = rel_segment
|
||
|
elsif abs_path
|
||
|
path = abs_path
|
||
|
end
|
||
|
# URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||
|
# relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
|
||
|
userinfo, host, port, registry,
|
||
|
rel_segment, abs_path, query, fragment = $~[1..-1]
|
||
|
if rel_segment && abs_path
|
||
|
path = rel_segment + abs_path
|
||
|
elsif rel_segment
|
||
|
path = rel_segment
|
||
|
elsif abs_path
|
||
|
path = abs_path
|
||
|
end
|
||
|
# URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
|
||
|
# relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
|
||
|
# net_path = "//" authority [ abs_path ]
|
||
|
# abs_path = "/" path_segments
|
||
|
# rel_path = rel_segment [ abs_path ]
|
||
|
# net_path = "//" authority [ abs_path ]
|
||
|
# abs_path = "/" path_segments
|
||
|
# rel_path = rel_segment [ abs_path ]
|
||
|
# authority = server | reg_name
|
||
|
# server = [ [ userinfo "@" ] hostport ]
|
||
|
# authority = server | reg_name
|
||
|
# server = [ [ userinfo "@" ] hostport ]
|
||
|
else
|
||
|
raise InvalidURIError, "bad URI(is not URI?): #{uri}"
|
||
|
raise InvalidURIError, "bad URI(is not URI?): #{uri}"
|
||
|
end
|
||
|
path = '' if !path && !opaque # (see RFC2396 Section 5.2)
|
||
|
ret = [
|
||
|
scheme,
|
||
|
userinfo, host, port, # X
|
||
|
registry, # X
|
||
|
path, # Y
|
||
|
opaque, # Y
|
||
|
query,
|
||
|
fragment
|
||
|
scheme,
|
||
|
userinfo, host, port, # X
|
||
|
registry, # X
|
||
|
path, # Y
|
||
|
opaque, # Y
|
||
|
query,
|
||
|
fragment
|
||
|
]
|
||
|
return ret
|
||
|
end
|
||
|
def parse(uri)
|
||
|
scheme, userinfo, host, port,
|
||
|
registry, path, opaque, query, fragment = self.split(uri)
|
||
|
registry, path, opaque, query, fragment = self.split(uri)
|
||
|
if scheme && URI.scheme_list.include?(scheme.upcase)
|
||
|
URI.scheme_list[scheme.upcase].new(scheme, userinfo, host, port,
|
||
|
URI.scheme_list[scheme.upcase].new(scheme, userinfo, host, port,
|
||
|
registry, path, opaque, query,
|
||
|
fragment, self)
|
||
|
else
|
||
|
Generic.new(scheme, userinfo, host, port,
|
||
|
registry, path, opaque, query,
|
||
|
fragment, self)
|
||
|
Generic.new(scheme, userinfo, host, port,
|
||
|
registry, path, opaque, query,
|
||
|
fragment, self)
|
||
|
end
|
||
|
end
|
||
|
def join(*str)
|
||
|
u = self.parse(str[0])
|
||
|
str[1 .. -1].each do |x|
|
||
|
u = u.merge(x)
|
||
|
u = u.merge(x)
|
||
|
end
|
||
|
u
|
||
|
end
|
||
|
def extract(str, schemes = nil, &block)
|
||
|
if block_given?
|
||
|
str.scan(make_regexp(schemes)) { yield $& }
|
||
|
nil
|
||
|
str.scan(make_regexp(schemes)) { yield $& }
|
||
|
nil
|
||
|
else
|
||
|
result = []
|
||
|
str.scan(make_regexp(schemes)) { result.push $& }
|
||
|
result
|
||
|
result = []
|
||
|
str.scan(make_regexp(schemes)) { result.push $& }
|
||
|
result
|
||
|
end
|
||
|
end
|
||
|
def make_regexp(schemes = nil)
|
||
|
unless schemes
|
||
|
@regexp[:ABS_URI_REF]
|
||
|
@regexp[:ABS_URI_REF]
|
||
|
else
|
||
|
/(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
|
||
|
/(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
|
||
|
end
|
||
|
end
|
||
| ... | ... | |
|
# hostname = *( domainlabel "." ) toplabel [ "." ]
|
||
|
unless hostname
|
||
|
ret[:HOSTNAME] = hostname = "(?:#{domlabel}\\.)*#{toplabel}\\.?"
|
||
|
ret[:HOSTNAME] = hostname = "(?:#{domlabel}\\.)*#{toplabel}\\.?"
|
||
|
end
|
||
|
# RFC 2373, APPENDIX B:
|
||
| ... | ... | |
|
# host = hostname | IPv4address | IPv6reference (RFC 2732)
|
||
|
ret[:HOST] = host = "(?:#{hostname}|#{ipv4addr}|#{ipv6ref})"
|
||
|
# port = *digit
|
||
|
port = '\d*'
|
||
|
ret[:PORT] = port = '\d*'
|
||
|
# hostport = host [ ":" port ]
|
||
|
ret[:HOSTPORT] = hostport = "#{host}(?::#{port})?"
|
||
|
hostport = "#{host}(?::#{port})?"
|
||
|
# userinfo = *( unreserved | escaped |
|
||
|
# ";" | ":" | "&" | "=" | "+" | "$" | "," )
|
||