[Rubygems-developers] [patch] use open-uri in remote_installer.rb

Chad Fowler chad at chadfowler.com
Sat Mar 27 08:06:47 EST 2004


Nice patch.  It's great to see all of those "-" symbols in the patch. ;)

It has been applied.

Thanks,
Chad

On Mar 22, 2004, at 6:01 PM, George Marrows wrote:

> Nice work with rubygems!
>
> Here's a patch to use open-uri.rb in the remote installer. It 
> simplifies the code quite a bit & allows rubygems to make use of 
> open-uri's corrected no_proxy support.
>
> Warning: I've only tested that setting a proxy *doesn't* work (I don't 
> have access to a proxy), rather than tested that it does work. As it 
> defers to open-uri, though, I'm hoping it should be OK. Apologies if 
> not.
>
> -- George
>
> Index: lib/rubygems/remote_installer.rb
> ===================================================================
> RCS file: /var/cvs/rubygems/rubygems/lib/rubygems/remote_installer.rb,v
> retrieving revision 1.13
> diff -u -r1.13 remote_installer.rb
> --- lib/rubygems/remote_installer.rb    17 Mar 2004 02:20:40 -0000    
> 1.13
> +++ lib/rubygems/remote_installer.rb    22 Mar 2004 22:59:55 -0000
> @@ -6,7 +6,9 @@
>     ##
>     # http_proxy:: [String] URL of http proxy.  Will override any 
> environment
>     #   variable setting
> -    def initialize(http_proxy=nil)
> +    def initialize(http_proxy=true)
> +      require 'open-uri'
> +
>       @http_proxy=http_proxy
>     end
> @@ -15,6 +17,7 @@
>     # package_name:: [String] Name of the Gem to install
>     # version_requirement:: [default = "> 0.0.0"] Gem version 
> requirement to install
>     def install(package_name, version_requirement = "> 0.0.0", 
> force=false, directory=Gem.dir)
> +
>       unless version_requirement.respond_to?(:version)
>         version_requirement = 
> Version::Requirement.new(version_requirement)
>       end
> @@ -60,12 +63,17 @@
>     # Given a list of sources, return a hash of all the caches from 
> those sources, where the key is the source and the value is the cache.
>     def get_caches(sources)
>       require 'yaml'
> +
>       caches = {}
>       sources.each do |source|
> -        response = fetch(source + "/yaml")
> -        spec = YAML.load(response.body)
> -        raise "Didn't get a valid YAML document" if not spec
> -        caches[source] = spec
> +    open(source + "/yaml",
> +         :proxy => @http_proxy) do |yaml_source|
> +
> +      spec = YAML.load(yaml_source.read)
> +
> +      raise "Didn't get a valid YAML document" if not spec
> +      caches[source] = spec
> +    end
>       end
>       return caches
>     end
> @@ -110,39 +118,12 @@
>     def download_gem(destination_file, source, spec)
>       # TODO
>       uri = source + "/gems/#{spec.full_name}.gem"
> -      response = fetch(uri)
> -      write_gem_to_file(response.body, destination_file)
> -    end
> -    ##
> -    # Returns HTTP proxy info if specified
> -    # (code adapted/borrowed from raa-install)
> -    def get_proxy
> -      name = 'http_proxy'
> -      if proxy_uri = @http_proxy || ENV[name] || ENV[name.upcase]
> -        proxy_uri = URI.parse(proxy_uri)
> -        name = 'no_proxy'
> -        if no_proxy = ENV[name] || ENV[name.upcase]
> -          no_proxy.scan(/([^:,]*)(?::(\d+))?/) {|host, port|
> -            if /(\A|\.)#{Regexp.quote host}\z/i =~ proxy_uri.host && 
> (!port || 80 == port.to_i)
> -              proxy_uri = nil
> -              break
> -            end               -          }
> -        end
> -        proxy_uri
> -      else
> -        nil
> -      end
> -    end
> -    ##
> -    # Returns the class to use for downloading files via http.  This 
> method exists sole so that it can be overridden in the derived class 
> in a unit test to return a mock http class.  Note that we could 
> override the fetch method in the derived class instead, but then we 
> wouldn't be able to test it.
> -    def http_class
> -      require 'net/http'
> -      if proxy_uri = get_proxy
> -        Net::HTTP.Proxy(proxy_uri.host, proxy_uri.port)
> -      else
> -        Net::HTTP
> +      open(uri,
> +       :proxy => @http_proxy) do |gem_source|
> +
> +    write_gem_to_file(gem_source.read, destination_file)
> +
>       end
>     end
> @@ -152,23 +133,6 @@
>       end
>     end
> -    def fetch( uri_str, limit = 10 )
> -      require 'uri'
> -      require 'net/http'
> -
> -      # You should choose better exception.
> -      raise ArgumentError, 'http redirect too deep' if limit == 0
> -
> -      response = http_class().get_response(URI.parse(uri_str))
> -      case response
> -      when Net::HTTPSuccess     then response
> -      when Net::HTTPRedirection then fetch(response['location'], 
> limit - 1)
> -      else
> -        $stderr.puts "Error downloading #{uri_str}"
> -        response.error!
> -      end
> -    end
> -
>     def new_installer(gem)
>       return Installer.new(gem)
>     end
>
>
> _______________________________________________
> Rubygems-developers mailing list
> Rubygems-developers at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rubygems-developers



More information about the Rubygems-developers mailing list