class Excon::Connection
def request(params={}, &block)
(**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