download (Gem::RemoteFetcher)

    # File lib/rubygems/remote_fetcher.rb, line 77
      def download(spec, source_uri, install_dir = Gem.dir)
        if File.writable?(install_dir)
          cache_dir = File.join install_dir, 'cache'
        else
          cache_dir = File.join(Gem.user_dir, 'cache')
        end

        gem_file_name = "#{spec.full_name}.gem"
        local_gem_path = File.join cache_dir, gem_file_name

        FileUtils.mkdir_p cache_dir rescue nil unless File.exist? cache_dir

       # Always escape URI's to deal with potential spaces and such
        unless URI::Generic === source_uri
          source_uri = URI.parse(URI.escape(source_uri))
        end

        scheme = source_uri.scheme

        # URI.parse gets confused by MS Windows paths with forward slashes.
        scheme = nil if scheme =~ /^[a-z]$/i

        case scheme
        when 'http', 'https' then
          unless File.exist? local_gem_path then
            begin
              say "Downloading gem #{gem_file_name}" if
                Gem.configuration.really_verbose

              remote_gem_path = source_uri + "gems/#{gem_file_name}"

              gem = self.fetch_path remote_gem_path
            rescue Gem::RemoteFetcher::FetchError
              raise if spec.original_platform == spec.platform

              alternate_name = "#{spec.original_name}.gem"

              say "Failed, downloading gem #{alternate_name}" if
                Gem.configuration.really_verbose

              remote_gem_path = source_uri + "gems/#{alternate_name}"

              gem = self.fetch_path remote_gem_path
            end

            File.open local_gem_path, 'wb' do |fp|
              fp.write gem
            end
          end
        when 'file' then
          begin
            path = source_uri.path
            path = File.dirname(path) if File.extname(path) == '.gem'

            remote_gem_path = File.join(path, 'gems', gem_file_name)

            FileUtils.cp(remote_gem_path, local_gem_path)
          rescue Errno::EACCES
            local_gem_path = source_uri.to_s
          end

          say "Using local gem #{local_gem_path}" if
            Gem.configuration.really_verbose
        when nil then # TODO test for local overriding cache
          begin
            if Gem.win_platform? && source_uri.scheme && !source_uri.path.include?(':')
              FileUtils.cp URI.unescape(source_uri.scheme + ':' + source_uri.path), local_gem_path
            else
              FileUtils.cp URI.unescape(source_uri.path), local_gem_path
            end
          rescue Errno::EACCES
            local_gem_path = source_uri.to_s
          end

          say "Using local gem #{local_gem_path}" if
            Gem.configuration.really_verbose
        else
          raise Gem::InstallError, "unsupported URI scheme #{source_uri.scheme}"
        end

        local_gem_path
      end