Parent

Class/Module Index [+]

Quicksearch

Excon::Connection

Attributes

connection[R]
proxy[R]

Public Class Methods

new(url, params = {}) click to toggle source

Initializes a new Connection instance

@param [String] url The destination URL
@param [Hash<Symbol, >] params One or more optional params
  @option params [String] :body Default text to be sent over a socket. Only used if :body absent in Connection#request params
  @option params [Hash<Symbol, String>] :headers The default headers to supply in a request. Only used if params[:headers] is not supplied to Connection#request
  @option params [String] :host The destination host's reachable DNS name or IP, in the form of a String
  @option params [String] :path Default path; appears after 'scheme://host:port/'. Only used if params[:path] is not supplied to Connection#request
  @option params [Fixnum] :port The port on which to connect, to the destination host
  @option params [Hash]   :query Default query; appended to the 'scheme://host:port/path/' in the form of '?key=value'. Will only be used if params[:query] is not supplied to Connection#request
  @option params [String] :scheme The protocol; 'https' causes OpenSSL to be used
  @option params [String] :proxy Proxy server; e.g. 'http://myproxy.com:8888'
  @option params [Fixnum] :retry_limit Set how many times we'll retry a failed request.  (Default 4)
  @option params [Class] :instrumentor Responds to #instrument as in ActiveSupport::Notifications
  @option params [String] :instrumentor_name Name prefix for #instrument events.  Defaults to 'excon'
# File lib/excon/connection.rb, line 19
def initialize(url, params = {})
  uri = URI.parse(url)
  @connection = Excon.defaults.merge({
    :host       => uri.host,
    :host_port  => '' << uri.host << ':' << uri.port.to_s,
    :path       => uri.path,
    :port       => uri.port.to_s,
    :query      => uri.query,
    :scheme     => uri.scheme,
  }).merge!(params)
  # merge does not deep-dup, so make sure headers is not the original
  @connection[:headers] = @connection[:headers].dup

  @proxy = nil

  if @connection[:scheme] == HTTPS && (ENV.has_key?('https_proxy') || ENV.has_key?('HTTPS_PROXY'))
    @proxy = setup_proxy(ENV['https_proxy'] || ENV['HTTPS_PROXY'])
  elsif (ENV.has_key?('http_proxy') || ENV.has_key?('HTTP_PROXY'))
    @proxy = setup_proxy(ENV['http_proxy'] || ENV['HTTP_PROXY'])
  elsif @connection.has_key?(:proxy)
    @proxy = setup_proxy(@connection[:proxy])
  end

  if @proxy
    @connection[:headers]['Proxy-Connection'] ||= 'Keep-Alive'
    # https credentials happen in handshake
    if @connection[:scheme] == 'http' && (@proxy[:user] || @proxy[:password])
      auth = ['' << @proxy[:user].to_s << ':' << @proxy[:password].to_s].pack('m').delete(Excon::CR_NL)
      @connection[:headers]['Proxy-Authorization'] = 'Basic ' << auth
    end
  end

  if ENV.has_key?('EXCON_DEBUG') || ENV.has_key?('EXCON_STANDARD_INSTRUMENTOR')
    @connection[:instrumentor] = Excon::StandardInstrumentor
  end

  # Use Basic Auth if url contains a login
  if uri.user || uri.password
    @connection[:headers]['Authorization'] ||= 'Basic ' << ['' << uri.user.to_s << ':' << uri.password.to_s].pack('m').delete(Excon::CR_NL)
  end

  @socket_key = '' << @connection[:host_port]
  reset
end

Public Instance Methods

inspect() click to toggle source
# File lib/excon/connection.rb, line 151
def inspect
  vars = instance_variables.inject({}) do |accum, var|
    accum.merge!(var.to_sym => instance_variable_get(var))
  end
  if vars[:'@connection'][:headers].has_key?('Authorization')
    vars[:'@connection'] = vars[:'@connection'].dup
    vars[:'@connection'][:headers] = vars[:'@connection'][:headers].dup
    vars[:'@connection'][:headers]['Authorization'] = REDACTED
  end
  inspection = '#<Excon::Connection:'
  inspection << (object_id << 1).to_s(16)
  vars.each do |key, value|
    inspection << ' ' << key.to_s << '=' << value.inspect
  end
  inspection << '>'
  inspection
end
request(params, &block) click to toggle source

Sends the supplied request to the destination host.

@yield [chunk] @see Response#self.parse
@param [Hash<Symbol, >] params One or more optional params, override defaults set in Connection.new
  @option params [String] :body text to be sent over a socket
  @option params [Hash<Symbol, String>] :headers The default headers to supply in a request
  @option params [String] :host The destination host's reachable DNS name or IP, in the form of a String
  @option params [String] :path appears after 'scheme://host:port/'
  @option params [Fixnum] :port The port on which to connect, to the destination host
  @option params [Hash]   :query appended to the 'scheme://host:port/path/' in the form of '?key=value'
  @option params [String] :scheme The protocol; 'https' causes OpenSSL to be used
# File lib/excon/connection.rb, line 74
def request(params, &block)
  # connection has defaults, merge in new params to override
  params = @connection.merge(params)
  params[:headers] = @connection[:headers].merge(params[:headers] || {})
  params[:headers]['Host'] ||= '' << params[:host_port]

  # if path is empty or doesn't start with '/', insert one
  unless params[:path][0, 1] == '/'
    params[:path].insert(0, '/')
  end

  if block_given?
    $stderr.puts("Excon requests with a block are deprecated, pass :response_block instead (#{caller.first})")
    params[:response_block] = Proc.new
  end

  if params.has_key?(:instrumentor)
    if (retries_remaining ||= params[:retry_limit]) < params[:retry_limit]
      event_name = "#{params[:instrumentor_name]}.retry"
    else
      event_name = "#{params[:instrumentor_name]}.request"
    end
    response = params[:instrumentor].instrument(event_name, params) do
      request_kernel(params)
    end
    params[:instrumentor].instrument("#{params[:instrumentor_name]}.response", response.attributes)
    response
  else
    request_kernel(params)
  end
rescue => request_error
  if params[:idempotent] && [Excon::Errors::Timeout, Excon::Errors::SocketError,
      Excon::Errors::HTTPStatusError].any? {|ex| request_error.kind_of? ex }
    retries_remaining ||= params[:retry_limit]
    retries_remaining -= 1
    if retries_remaining > 0
      if params[:body].respond_to?(:pos=)
        params[:body].pos = 0
      end
      retry
    else
      if params.has_key?(:instrumentor)
        params[:instrumentor].instrument("#{params[:instrumentor_name]}.error", :error => request_error)
      end
      raise(request_error)
    end
  else
    if params.has_key?(:instrumentor)
      params[:instrumentor].instrument("#{params[:instrumentor_name]}.error", :error => request_error)
    end
    raise(request_error)
  end
end
reset() click to toggle source
# File lib/excon/connection.rb, line 128
def reset
  (old_socket = sockets.delete(@socket_key)) && old_socket.close
end
retry_limit() click to toggle source
# File lib/excon/connection.rb, line 146
def retry_limit
  $stderr.puts("Excon::Connection#retry_limit is deprecated, pass :retry_limit to the initializer (#{caller.first})")
  @connection[:retry_limit] ||= DEFAULT_RETRY_LIMIT
end
retry_limit=(new_retry_limit) click to toggle source
# File lib/excon/connection.rb, line 141
def retry_limit=(new_retry_limit)
  $stderr.puts("Excon::Connection#retry_limit= is deprecated, pass :retry_limit to the initializer (#{caller.first})")
  @connection[:retry_limit] = new_retry_limit
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.