lib/ruby/shared/rubygems/remote_fetcher.rb
##
# Performs a Net::HTTP request of type +request_class+ on +uri+ returning
# a Net::HTTP response object.  request maintains a table of persistent
# connections to reduce connect overhead.
Performs a Net::HTTP request of type +request_class+ on +uri+ returning
a Net::HTTP response object.  request maintains a table of persistent
connections to reduce connect overhead.
Performs a Net :: HTTP request of type + request_class + on + uri + returning a Net :: HTTP response object . request maintains a table of persistent connections to reduce connect overhead .
def request(uri, request_class, last_modified = nil)
    request = request_class.new uri.request_uri
    unless uri.nil? || uri.user.nil? || uri.user.empty? then
      request.basic_auth uri.user, uri.password
    end
    request.add_field 'User-Agent', @user_agent
    request.add_field 'Connection', 'keep-alive'
    request.add_field 'Keep-Alive', '30'
    if last_modified then
      last_modified = last_modified.utc
      request.add_field 'If-Modified-Since', last_modified.rfc2822
    end
    yield request if block_given?
    connection = connection_for uri
    retried = false
    bad_response = false
    begin
      @requests[connection.object_id] += 1
      say "#{request.method} #{uri}" if
        Gem.configuration.really_verbose
      file_name = File.basename(uri.path)
      if request.response_body_permitted? && file_name =~ /\.gem$/
        reporter = ui.download_reporter
        response = connection.request(request) do |incomplete_response|
          if Net::HTTPOK === incomplete_response
            reporter.fetch(file_name, incomplete_response.content_length)
            downloaded = 0
            data = ''
            incomplete_response.read_body do |segment|
              data << segment
              downloaded += segment.length
              reporter.update(downloaded)
            end
            reporter.done
            if incomplete_response.respond_to? :body=
              incomplete_response.body = data
            else
              incomplete_response.instance_variable_set(:@body, data)
            end
          end
        end
      else
        response = connection.request request
      end
      say "#{response.code} #{response.message}" if
        Gem.configuration.really_verbose
    rescue Net::HTTPBadResponse
      say "bad response" if Gem.configuration.really_verbose
      reset connection
      raise FetchError.new('too many bad responses', uri) if bad_response
      bad_response = true
      retry
    rescue EOFError, Timeout::Error,
           Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE
      requests = @requests[connection.object_id]
      say "connection reset after #{requests} requests, retrying" if
        Gem.configuration.really_verbose
      raise FetchError.new('too many connection resets', uri) if retried
      reset connection
      retried = true
      retry
    end
    response
  end
def request ( uri , request_class , last_modified = nil ) request = request_class . new uri . request_uri unless uri . nil? || uri . user . nil? || uri . user . empty? then request . basic_auth uri . user , uri . password end request . add_field 'User-Agent' , @user_agent request . add_field 'Connection' , 'keep-alive' request . add_field 'Keep-Alive' , '30' if last_modified then last_modified = last_modified . utc request . add_field 'If-Modified-Since' , last_modified . rfc2822 end yield request if block_given? connection = connection_for uri retried = false bad_response = false begin @requests [ connection . object_id ] += 1 say "#{request.method} #{uri}" if Gem . configuration . really_verbose file_name = File . basename ( uri . path ) if request . response_body_permitted? && file_name =~ / \. gem$ / reporter = ui . download_reporter response = connection . request ( request ) do | incomplete_response | if Net :: HTTPOK === incomplete_response reporter . fetch ( file_name , incomplete_response . content_length ) downloaded = 0 data = '' incomplete_response . read_body do | segment | data << segment downloaded += segment . length reporter . update ( downloaded ) end reporter . done if incomplete_response . respond_to? :body= incomplete_response . body = data else incomplete_response . instance_variable_set ( :@body , data ) end end end else response = connection . request request end say "#{response.code} #{response.message}" if Gem . configuration . really_verbose rescue Net :: HTTPBadResponse say "bad response" if Gem . configuration . really_verbose reset connection raise FetchError . new ( 'too many bad responses' , uri ) if bad_response bad_response = true retry rescue EOFError , Timeout :: Error , Errno :: ECONNABORTED , Errno :: ECONNRESET , Errno :: EPIPE requests = @requests [ connection . object_id ] say "connection reset after #{requests} requests, retrying" if Gem . configuration . really_verbose raise FetchError . new ( 'too many connection resets' , uri ) if retried reset connection retried = true retry end response end
Performs a Net::HTTP request of type +request_class+ on +uri+ returning
a Net::HTTP response object.
Performs a Net :: HTTP request of type + request_class + on + uri + returning a Net :: HTTP response object .
# perform download progress reporter only for gems # HACK work around EOFError bug in Net::HTTP # NOTE Errno::ECONNABORTED raised a lot on Windows, and make impossible # to install gems.
uri
<not_specific>
request_class
<not_specific>
last_modified
<not_specific>