# frozen_string_literal: true module Excon CR_NL = "\r\n" DEFAULT_CA_FILE = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "data", "cacert.pem")) DEFAULT_CHUNK_SIZE = 1048576 # 1 megabyte # avoid overwrite if somebody has redefined unless const_defined?(:CHUNK_SIZE) CHUNK_SIZE = DEFAULT_CHUNK_SIZE end DEFAULT_REDIRECT_LIMIT = 10 DEFAULT_RETRY_LIMIT = 4 DEFAULT_RETRY_ERRORS = [ Excon::Error::Timeout, Excon::Error::Socket, Excon::Error::HTTPStatus ] FORCE_ENC = CR_NL.respond_to?(:force_encoding) HTTP_1_1 = " HTTP/1.1\r\n" HTTP_VERBS = %w{connect delete get head options patch post put trace} HTTPS = 'https' NO_ENTITY = [204, 205, 304].freeze REDACTED = 'REDACTED' UNIX = 'unix' USER_AGENT = "excon/#{VERSION}" VERSIONS = "#{USER_AGENT} (#{RUBY_PLATFORM}) ruby/#{RUBY_VERSION}" VALID_REQUEST_KEYS = [ :allow_unstubbed_requests, :body, :chunk_size, :debug_request, :debug_response, :headers, :instrumentor, # Used for setting logging within Connection :logger, :method, :middlewares, :password, :path, :persistent, :pipeline, :query, :read_timeout, :request_block, :response_block, :stubs, :user, :versions, :write_timeout ] VALID_CONNECTION_KEYS = VALID_REQUEST_KEYS + [ :ciphers, :client_key, :client_key_data, :client_key_pass, :client_cert, :client_cert_data, :certificate, :certificate_path, :disable_proxy, :private_key, :private_key_path, :connect_timeout, :family, :keepalive, :host, :hostname, :omit_default_port, :nonblock, :reuseaddr, :port, :proxy, :scheme, :socket, :ssl_ca_file, :ssl_ca_path, :ssl_cert_store, :ssl_verify_callback, :ssl_verify_peer, :ssl_verify_peer_host, :ssl_version, :ssl_min_version, :ssl_max_version, :ssl_uri_schemes, :tcp_nodelay, :thread_safe_sockets, :uri_parser, ] DEPRECATED_VALID_REQUEST_KEYS = { :captures => 'Mock', :expects => 'Expects', :idempotent => 'Idempotent', :instrumentor_name => 'Instrumentor', :mock => 'Mock', :retries_remaining => 'Idempotent', # referenced in Instrumentor, but only relevant with Idempotent :retry_errors => 'Idempotent', :retry_interval => 'Idempotent', :retry_limit => 'Idempotent' # referenced in Instrumentor, but only relevant with Idempotent } unless ::IO.const_defined?(:WaitReadable) class ::IO module WaitReadable; end end end unless ::IO.const_defined?(:WaitWritable) class ::IO module WaitWritable; end end end # these come last as they rely on the above DEFAULTS = { :chunk_size => CHUNK_SIZE || DEFAULT_CHUNK_SIZE, # see https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29 # list provided then had DES related things sorted to the end :ciphers => 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA:!DSS', :connect_timeout => 60, :debug_request => false, :debug_response => false, :headers => { 'User-Agent' => USER_AGENT, 'Accept' => '*/*' }, :idempotent => false, :instrumentor_name => 'excon', :middlewares => [ Excon::Middleware::ResponseParser, Excon::Middleware::Expects, Excon::Middleware::Idempotent, Excon::Middleware::Instrumentor, Excon::Middleware::Mock ], :mock => false, :nonblock => true, :omit_default_port => false, :persistent => false, :read_timeout => 60, :retry_errors => DEFAULT_RETRY_ERRORS, :retry_limit => DEFAULT_RETRY_LIMIT, :ssl_verify_peer => true, :ssl_uri_schemes => [HTTPS], :stubs => :global, :tcp_nodelay => false, :thread_safe_sockets => true, :uri_parser => URI, :versions => VERSIONS, :write_timeout => 60 } end