# frozen_string_literal: true$:.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/version'require'excon/extensions/uri'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/error'require'excon/constants'require'excon/utils'require'excon/connection'require'excon/headers'require'excon/response'require'excon/middlewares/decompress'require'excon/middlewares/escape_path'require'excon/middlewares/redirect_follower'require'excon/middlewares/capture_cookies'require'excon/pretty_printer'require'excon/socket'require'excon/ssl_socket'require'excon/instrumentors/standard_instrumentor'require'excon/instrumentors/logging_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)# Show warning if $VERBOSE or ENV['EXCON_DEBUG'] is setif$VERBOSE||ENV['EXCON_DEBUG']$stderr.puts"[excon][WARNING] #{warning}\n#{caller.join("\n")}"endif@raise_on_warningsraiseError::Warning.new(warning)endenddefset_raise_on_warnings!(should_raise)@raise_on_warnings=should_raiseend# 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]||defaults[:uri_parser]uri=uri_parser.parse(url)ifparams[:path]uri_parser.parse(params[:path])endunlessuri.schemeraiseArgumentError.new("Invalid URI: #{uri}")endparams={:host=>uri.host,:hostname=>uri.hostname,: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 request_params [Hash<Symbol, >] request params to match against, omitted params match all# @param response_params [Hash<Symbol, >] response params to return from matched request or block to call with paramsdefstub(request_params={},response_params=nil,&block)if(method=request_params.delete(:method))request_params[:method]=method.to_s.downcase.to_symendif(url=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,block]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 request_params [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={})if(method=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]whenRegexpcaserequest_params[:headers][key]whenStringif(match=value.match(request_params[:headers][key]))captures[:headers][key]=match.capturesendwhenRegexp# for unstub on regex paramsmatch=(value==request_params[:headers][key])endmatchelsevalue==request_params[:headers][key]endendnon_headers_match=(stub.keys-[:headers]).all?do|key|casevalue=stub[key]whenRegexpcaserequest_params[key]whenStringif(match=value.match(request_params[key]))captures[key]=match.capturesendwhenRegexp# for unstub on regex paramsmatch=(value==request_params[key])endmatchelsevalue==request_params[key]endendifheaders_match&&non_headers_matchrequest_params[:captures]=capturesreturn[stub,response_params]endendnilend# get a list of defined stubsdefstubscaseExcon.defaults[:stubs]when:global@stubs||=[]when:localThread.current[:_excon_stubs]||=[]endend# remove first/oldest stub matching request_params or nil if none match# @param request_params [Hash<Symbol, >] request params to match against, omitted params match all# @return [Hash<Symbol, >] response params from deleted stubdefunstub(request_params={})if(stub=stub_for(request_params))Excon.stubs.delete_at(Excon.stubs.index(stub))endend# 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