# 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