$:.unshift(File.dirname(__FILE__))unless$:.include?(File.dirname(__FILE__))||$:.include?(File.expand_path(File.dirname(__FILE__)))require'cgi'require'forwardable'require'openssl'require'rbconfig'require'socket'require'timeout'require'uri'require'zlib'require'stringio'require'excon/middlewares/base'require'excon/middlewares/expects'require'excon/middlewares/idempotent'require'excon/middlewares/instrumentor'require'excon/middlewares/mock'require'excon/middlewares/response_parser'require'excon/constants'require'excon/utils'require'excon/connection'require'excon/errors'require'excon/headers'require'excon/response'require'excon/middlewares/decompress'require'excon/middlewares/escape_path'require'excon/middlewares/redirect_follower'require'excon/pretty_printer'require'excon/socket'require'excon/ssl_socket'require'excon/standard_instrumentor'require'excon/unix_socket'# Define defaults first so they will be available to other filesmoduleExconclass<<self# @return [Hash] defaults for Excon connectionsdefdefaults@defaults||=DEFAULTSend# Change defaults for Excon connections# @return [Hash] defaults for Excon connectionsdefdefaults=(new_defaults)@defaults=new_defaultsenddefdisplay_warning(warning)# Respect Ruby's $VERBOSE setting, unless EXCON_DEBUG is setif!$VERBOSE.nil?||ENV['EXCON_DEBUG']$stderr.puts'[excon][WARNING] '<<warning<<"\n#{caller.join("\n")}"endend# Status of mockingdefmockdisplay_warning('Excon#mock is deprecated, use Excon.defaults[:mock] instead.')self.defaults[:mock]end# Change the status of mocking# false is the default and works as expected# true returns a value from stubs or raisesdefmock=(new_mock)display_warning('Excon#mock is deprecated, use Excon.defaults[:mock]= instead.')self.defaults[:mock]=new_mockend# @return [String] The filesystem path to the SSL Certificate Authoritydefssl_ca_pathdisplay_warning('Excon#ssl_ca_path is deprecated, use Excon.defaults[:ssl_ca_path] instead.')self.defaults[:ssl_ca_path]end# Change path to the SSL Certificate Authority# @return [String] The filesystem path to the SSL Certificate Authoritydefssl_ca_path=(new_ssl_ca_path)display_warning('Excon#ssl_ca_path= is deprecated, use Excon.defaults[:ssl_ca_path]= instead.')self.defaults[:ssl_ca_path]=new_ssl_ca_pathend# @return [true, false] Whether or not to verify the peer's SSL certificate / chaindefssl_verify_peerdisplay_warning('Excon#ssl_verify_peer is deprecated, use Excon.defaults[:ssl_verify_peer] instead.')self.defaults[:ssl_verify_peer]end# Change the status of ssl peer verification# @see Excon#ssl_verify_peer (attr_reader)defssl_verify_peer=(new_ssl_verify_peer)display_warning('Excon#ssl_verify_peer= is deprecated, use Excon.defaults[:ssl_verify_peer]= instead.')self.defaults[:ssl_verify_peer]=new_ssl_verify_peerend# @see Connection#initialize# Initializes a new keep-alive session for a given remote host# @param [String] url The destination URL# @param [Hash<Symbol, >] params One or more option params to set on the Connection instance# @return [Connection] A new Excon::Connection instancedefnew(url,params={})uri_parser=params[:uri_parser]||Excon.defaults[:uri_parser]uri=uri_parser.parse(url)unlessuri.schemeraiseArgumentError.new("Invalid URI: #{uri}")endparams={:host=>uri.host,:path=>uri.path,:port=>uri.port,:query=>uri.query,:scheme=>uri.scheme}.merge!(params)ifuri.passwordparams[:password]=Utils.unescape_uri(uri.password)endifuri.userparams[:user]=Utils.unescape_uri(uri.user)endExcon::Connection.new(params)end# push an additional stub onto the list to check for mock requests# @param [Hash<Symbol, >] request params to match against, omitted params match all# @param [Hash<Symbol, >] response params to return from matched request or block to call with paramsdefstub(request_params={},response_params=nil)ifmethod=request_params.delete(:method)request_params[:method]=method.to_s.downcase.to_symendifurl=request_params.delete(:url)uri=URI.parse(url)request_params={:host=>uri.host,:path=>uri.path,:port=>uri.port,:query=>uri.query,:scheme=>uri.scheme}.merge!(request_params)ifuri.user||uri.passwordrequest_params[:headers]||={}user,pass=Utils.unescape_form(uri.user.to_s),Utils.unescape_form(uri.password.to_s)request_params[:headers]['Authorization']||='Basic '<<[''<<user<<':'<<pass].pack('m').delete(Excon::CR_NL)endendifrequest_params.has_key?(:headers)headers=Excon::Headers.newrequest_params[:headers].eachdo|key,value|headers[key]=valueendrequest_params[:headers]=headersendifblock_given?ifresponse_paramsraise(ArgumentError.new("stub requires either response_params OR a block"))elsestub=[request_params,Proc.new]endelsifresponse_paramsstub=[request_params,response_params]elseraise(ArgumentError.new("stub requires either response_params OR a block"))endstubs.unshift(stub)stubend# get a stub matching params or nil# @param [Hash<Symbol, >] request params to match against, omitted params match all# @return [Hash<Symbol, >] response params to return from matched request or block to call with paramsdefstub_for(request_params={})ifmethod=request_params.delete(:method)request_params[:method]=method.to_s.downcase.to_symendExcon.stubs.eachdo|stub,response_params|captures={:headers=>{}}headers_match=!stub.has_key?(:headers)||stub[:headers].keys.all?do|key|casevalue=stub[:headers][key]whenRegexpifmatch=value.match(request_params[:headers][key])captures[:headers][key]=match.capturesendmatchelsevalue==request_params[:headers][key]endendnon_headers_match=(stub.keys-[:headers]).all?do|key|casevalue=stub[key]whenRegexpifmatch=value.match(request_params[key])captures[key]=match.capturesendmatchelsevalue==request_params[key]endendifheaders_match&&non_headers_matchrequest_params[:captures]=capturesreturn[stub,response_params]endendnilend# get a list of defined stubsdefstubs@stubs||=[]end# remove first/oldest stub matching request_params# @param [Hash<Symbol, >] request params to match against, omitted params match all# @return [Hash<Symbol, >] response params from deleted stubdefunstub(request_params={})stub=stub_for(request_params)Excon.stubs.delete_at(Excon.stubs.index(stub))end# Generic non-persistent HTTP methodsHTTP_VERBS.eachdo|method|module_eval<<-DEF,__FILE__,__LINE__+1
def #{method}(url, params = {}, &block)
new(url, params).request(:method => :#{method}, &block)
end
DEFendendend