class Excon::Connection

def request(params={}, &block)

Options Hash: (**params)
  • :query (Hash) -- appended to the 'scheme://host:port/path/' in the form of '?key=value'
  • :path (String) -- appears after 'scheme://host:port/'
  • :headers (Hash) -- The default headers to supply in a request
  • :body (String) -- text to be sent over a socket

Parameters:
  • params (Hash) -- One or more optional params, override defaults set in Connection.new

Other tags:
    Yield: - @see Response#self.parse
def request(params={}, &block)
  params = validate_params(:request, params)
  # @data has defaults, merge in new params to override
  datum = @data.merge(params)
  datum[:headers] = @data[:headers].merge(datum[:headers] || {})
  if datum[:scheme] == UNIX
    datum[:headers]['Host']   ||= '' << datum[:socket]
  else
    datum[:headers]['Host']   ||= '' << datum[:host] << port_string(datum)
  end
  datum[:retries_remaining] ||= datum[:retry_limit]
  # if path is empty or doesn't start with '/', insert one
  unless datum[:path][0, 1] == '/'
    datum[:path] = datum[:path].dup.insert(0, '/')
  end
  if block_given?
    Excon.display_warning('Excon requests with a block are deprecated, pass :response_block instead.')
    datum[:response_block] = Proc.new
  end
  if datum[:idempotent]
    if datum[:request_block]
      Excon.display_warning('Excon requests with a :request_block can not be :idempotent.')
      datum[:idempotent] = false
    end
    if datum[:pipeline]
      Excon.display_warning("Excon requests can not be :idempotent when pipelining.")
      datum[:idempotent] = false
    end
  end
  datum[:connection] = self
  datum[:stack] = datum[:middlewares].map do |middleware|
    lambda {|stack| middleware.new(stack)}
  end.reverse.inject(self) do |middlewares, middleware|
    middleware.call(middlewares)
  end
  datum = datum[:stack].request_call(datum)
  unless datum[:pipeline]
    datum = response(datum)
    if datum[:persistent]
      if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Connection') == 0 }
        if split_header_value(datum[:response][:headers][key]).any? {|t| t.casecmp('close') == 0 }
          reset
        end
      end
    else
      reset
    end
    Excon::Response.new(datum[:response])
  else
    datum
  end
rescue => error
  reset
  datum[:error] = error
  if datum[:stack]
    datum[:stack].error_call(datum)
  else
    raise error
  end
end