123456789_123456789_123456789_123456789_123456789_

Class: Gem::Uri

Relationships & Source Files
Inherits: Object
Defined in: lib/rubygems/uri.rb

Overview

The Uri handles rubygems source URIs.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(source_uri) ⇒ Uri

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 46

def initialize(source_uri)
  @parsed_uri = parse(source_uri)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &blk)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 72

def method_missing(method_name, *args, &blk)
  if @parsed_uri.respond_to?(method_name)
    @parsed_uri.send(method_name, *args, &blk)
  else
    super
  end
end

Class Method Details

.parse(uri)

Parses uri, returning the original uri if it’s invalid

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 40

def self.parse(uri)
  parse!(uri)
rescue Gem::URI::InvalidURIError
  uri
end

.parse!(uri)

Parses uri, raising if it’s invalid

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 18

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

.redact(uri)

Parses and redacts uri

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 11

def self.redact(uri)
  new(uri).redacted
end

Instance Attribute Details

#oauth_basic?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 115

def oauth_basic?
  password == "x-oauth-basic"
end

#parsed_uri (readonly, protected)

Add a protected reader for the cloned instance to access the original object’s parsed uri

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 87

attr_reader :parsed_uri

#password?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 111

def password?
  !!password
end

#token?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 119

def token?
  !user.nil? && password.nil?
end

#valid_uri?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 107

def valid_uri?
  !@parsed_uri.is_a?(String)
end

Instance Method Details

#initialize_copy(original) (private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 123

def initialize_copy(original)
  @parsed_uri = original.parsed_uri.clone
end

#parse(uri) (private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 95

def parse(uri)
  self.class.parse(uri)
end

#parse!(uri) (private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 91

def parse!(uri)
  self.class.parse!(uri)
end

#redact_credentials_from(text)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 66

def redact_credentials_from(text)
  return text unless valid_uri? && password? && text.include?(to_s)

  text.sub(password, "REDACTED")
end

#redacted

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 50

def redacted
  return self unless valid_uri?

  if token? || oauth_basic?
    with_redacted_user
  elsif password?
    with_redacted_password
  else
    self
  end
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 80

def respond_to_missing?(method_name, include_private = false)
  @parsed_uri.respond_to?(method_name, include_private) || super
end

#to_s

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 62

def to_s
  @parsed_uri.to_s
end

#with_redacted_password (private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 103

def with_redacted_password
  clone.tap {|uri| uri.password = "REDACTED" }
end

#with_redacted_user (private)

[ GitHub ]

  
# File 'lib/rubygems/uri.rb', line 99

def with_redacted_user
  clone.tap {|uri| uri.user = "REDACTED" }
end