Class that parses String’s into Bundler::URI’s.
It contains a Hash set of patterns and Regexp’s that match and validate.
Bundler::URI::Parser.new([opts])
The constructor accepts a hash as options for parser. Keys of options are pattern names of Bundler::URI components and values of options are pattern strings. The constructor generates set of regexps for parsing URIs.
You can use the following keys:
* :ESCAPED (Bundler::URI::PATTERN::ESCAPED in default) * :UNRESERVED (Bundler::URI::PATTERN::UNRESERVED in default) * :DOMLABEL (Bundler::URI::PATTERN::DOMLABEL in default) * :TOPLABEL (Bundler::URI::PATTERN::TOPLABEL in default) * :HOSTNAME (Bundler::URI::PATTERN::HOSTNAME in default)
p = Bundler::URI::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})") u = p.parse("http://example.jp/%uABCD") #=> #<Bundler::URI::HTTP http://example.jp/%uABCD> Bundler::URI.parse(u.to_s) #=> raises Bundler::URI::InvalidURIError s = "http://example.com/ABCD" u1 = p.parse(s) #=> #<Bundler::URI::HTTP http://example.com/ABCD> u2 = Bundler::URI.parse(s) #=> #<Bundler::URI::HTTP http://example.com/ABCD> u1 == u2 #=> true u1.eql?(u2) #=> false
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 100
def initialize(opts = {})
@pattern = initialize_pattern(opts)
@pattern.each_value(&:freeze)
@pattern.freeze
@regexp = initialize_regexp(@pattern)
@regexp.each_value(&:freeze)
@regexp.freeze
end
str
String to make safe
unsafe
Regexp to apply. Defaults to self.regexp
Constructs a safe String from str, removing unsafe characters,
replacing them with codes.
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 300
def escape(str, unsafe = @regexp[:UNSAFE])
unless unsafe.kind_of?(Regexp)
# perhaps unsafe is String object
unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false)
end
str.gsub(unsafe) do
us = $&
tmp = ''
us.each_byte do |uc|
tmp << sprintf('%%%02X', uc)
end
tmp
end.force_encoding(Encoding::US_ASCII)
end
str
String to search
schemes
Patterns to apply to str
Attempts to parse and merge a set of URIs. If no block given,
then returns the result, else it calls block for each element
in result.
See also Bundler::URI::Parser.make_regexp.
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 262
def extract(str, schemes = nil)
if block_given?
str.scan(make_regexp(schemes)) { yield $& }
nil
else
result = []
str.scan(make_regexp(schemes)) { result.push $& }
result
end
end
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 338
def inspect
@@to_s.bind_call(self)
end
Returns Regexp that is default self.regexp,
unless schemes is provided. Then it is a Regexp.union with self.pattern.
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 275
def make_regexp(schemes = nil)
unless schemes
@regexp[:ABS_URI_REF]
else
/(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
end
end
uri
String
Parses uri and constructs either matching Bundler::URI scheme object (File, FTP, HTTP, HTTPS, LDAP, LDAPS, or MailTo) or Bundler::URI::Generic.
p = Bundler::URI::Parser.new p.parse("ldap://ldap.example.com/dc=example?user=john") #=> #<Bundler::URI::LDAP ldap://ldap.example.com/dc=example?user=john>
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 210
def parse(uri)
scheme, userinfo, host, port,
registry, path, opaque, query, fragment = self.split(uri)
if scheme && Bundler::URI.scheme_list.include?(scheme.upcase)
Bundler::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)
end
end
Returns a split Bundler::URI against regexp.
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 121
def split(uri)
case uri
when ''
# null uri
when @regexp[:ABS_URI]
scheme, opaque, userinfo, host, port,
registry, path, query, fragment = $~[1..-1]
# Bundler::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 Bundler::URI(absolute but no scheme): #{uri}"
end
if !opaque && (!path && (!host && !registry))
raise InvalidURIError,
"bad Bundler::URI(absolute but no path): #{uri}"
end
when @regexp[:REL_URI]
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
# Bundler::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 ]
# authority = server | reg_name
# server = [ [ userinfo "@" ] hostport ]
else
raise InvalidURIError, "bad Bundler::URI(is not Bundler::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
]
return ret
end
str
String to remove escapes from
escaped
Regexp to apply. Defaults to self.regexp
Removes escapes from str.
# File bundler/vendor/uri/lib/uri/rfc2396_parser.rb, line 331
def unescape(str, escaped = @regexp[:ESCAPED])
enc = str.encoding
enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
end