# 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'ipaddr'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/decompress'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/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 connectionsattr_writer:defaultsdefdisplay_warning(warning)# Show warning if $VERBOSE or ENV['EXCON_DEBUG'] is set($VERBOSE||ENV['EXCON_DEBUG'])&&Warning.warn("[excon][WARNING] #{warning}\n#{caller.join("\n")}")returnunless@raise_on_warningsraise(Error::Warning,warning)enddefset_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)params[:path]&&uri_parser.parse(params[:path])raise(ArgumentError,"Invalid URI: #{uri}")unlessuri.schemeparams={host: uri.host,hostname: uri.hostname,path: uri.path,port: uri.port,query: uri.query,scheme: uri.scheme}.merge(params)uri.password&¶ms[:password]=Utils.unescape_uri(uri.password)uri.user&¶ms[:user]=Utils.unescape_uri(uri.user)Excon::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 or block to call with matched 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.empty??'/':uri.path,port: uri.port,query: uri.query,scheme: uri.scheme}.merge!(request_params)ifuri.user||uri.passwordrequest_params[:headers]||={}user=Utils.unescape_form(uri.user.to_s)pass=Utils.unescape_form(uri.password.to_s)request_params[:headers]['Authorization']||='Basic '+["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)endendifrequest_params.key?(:headers)headers=Excon::Headers.newrequest_params[:headers].eachdo|key,value|headers[key]=valueendrequest_params[:headers]=headersendrequest_params[:query]=Utils.query_string(request_params)[1...]ifrequest_params.key?(:query)ifblock_given?raise(ArgumentError,'stub requires either response_params OR a block')ifresponse_paramsstub=[request_params,block]elsifresponse_paramsstub=[request_params,response_params]elseraise(ArgumentError,'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_symendrequest_params[:query]=Utils.query_string(request_params)[1...]ifrequest_params.key?(:query)Excon.stubs.eachdo|stub,response_params|captures={headers: {}}headers_match=!stub.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={})returnunless(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