diff options
Diffstat (limited to 'lib/rubygems/uri.rb')
-rw-r--r-- | lib/rubygems/uri.rb | 84 |
1 files changed, 54 insertions, 30 deletions
diff --git a/lib/rubygems/uri.rb b/lib/rubygems/uri.rb index 031d7e01c3..a44aaceba5 100644 --- a/lib/rubygems/uri.rb +++ b/lib/rubygems/uri.rb @@ -5,6 +5,44 @@ # class Gem::Uri + ## + # Parses and redacts uri + + def self.redact(uri) + new(uri).redacted + end + + ## + # Parses uri, raising if it's invalid + + def self.parse!(uri) + require_relative "vendor/uri/lib/uri" + + raise Gem::URI::InvalidURIError unless uri + + return uri unless uri.is_a?(String) + + # Always escape URI's to deal with potential spaces and such + # It should also be considered that source_uri may already be + # a valid URI with escaped characters. e.g. "{DESede}" is encoded + # as "%7BDESede%7D". If this is escaped again the percentage + # symbols will be escaped. + begin + Gem::URI.parse(uri) + rescue Gem::URI::InvalidURIError + Gem::URI.parse(Gem::URI::DEFAULT_PARSER.escape(uri)) + end + end + + ## + # Parses uri, returning the original uri if it's invalid + + def self.parse(uri) + parse!(uri) + rescue Gem::URI::InvalidURIError + uri + end + def initialize(source_uri) @parsed_uri = parse(source_uri) end @@ -26,9 +64,9 @@ class Gem::Uri end def redact_credentials_from(text) - return text unless valid_uri? && password? + return text unless valid_uri? && password? && text.include?(to_s) - text.sub(password, 'REDACTED') + text.sub(password, "REDACTED") end def method_missing(method_name, *args, &blk) @@ -43,45 +81,27 @@ class Gem::Uri @parsed_uri.respond_to?(method_name, include_private) || super end - private - - ## - # Parses the #uri, raising if it's invalid + protected - def parse!(uri) - require "uri" + # Add a protected reader for the cloned instance to access the original object's parsed uri + attr_reader :parsed_uri - raise URI::InvalidURIError unless uri + private - # Always escape URI's to deal with potential spaces and such - # It should also be considered that source_uri may already be - # a valid URI with escaped characters. e.g. "{DESede}" is encoded - # as "%7BDESede%7D". If this is escaped again the percentage - # symbols will be escaped. - begin - URI.parse(uri) - rescue URI::InvalidURIError - URI.parse(URI::DEFAULT_PARSER.escape(uri)) - end + def parse!(uri) + self.class.parse!(uri) end - ## - # Parses the #uri, returning the original uri if it's invalid - def parse(uri) - return uri unless uri.is_a?(String) - - parse!(uri) - rescue URI::InvalidURIError - uri + self.class.parse(uri) end def with_redacted_user - clone.tap {|uri| uri.user = 'REDACTED' } + clone.tap {|uri| uri.user = "REDACTED" } end def with_redacted_password - clone.tap {|uri| uri.password = 'REDACTED' } + clone.tap {|uri| uri.password = "REDACTED" } end def valid_uri? @@ -93,10 +113,14 @@ class Gem::Uri end def oauth_basic? - password == 'x-oauth-basic' + password == "x-oauth-basic" end def token? !user.nil? && password.nil? end + + def initialize_copy(original) + @parsed_uri = original.parsed_uri.clone + end end |