Object
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
# 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
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
# File lib/excon/connection.rb, line 128 def reset (old_socket = sockets.delete(@socket_key)) && old_socket.close end
Generated with the Darkfish Rdoc Generator 2.