class HTTPX::Options

  1. lib/httpx/options.rb
  2. lib/httpx/transcoder/utils/deflater.rb
  3. show all
Superclass: Object

Contains a set of options which are passed and shared across from session to its requests or responses.

Constants

BUFFER_SIZE = 1 << 14  
CLOSE_HANDSHAKE_TIMEOUT = 10  
CONNECT_TIMEOUT = READ_TIMEOUT = WRITE_TIMEOUT = 60  
DEFAULT_OPTIONS = { :max_requests => Float::INFINITY, :debug => ENV.key?("HTTPX_DEBUG") ? $stderr : nil, :debug_level => (ENV["HTTPX_DEBUG"] || 1).to_i, :ssl => {}, :http2_settings => { settings_enable_push: 0 }, :fallback_protocol => "http/1.1", :supported_compression_formats => %w[gzip deflate], :decompress_response_body => true, :compress_request_body => true, :timeout => { connect_timeout: CONNECT_TIMEOUT, settings_timeout: SETTINGS_TIMEOUT, close_handshake_timeout: CLOSE_HANDSHAKE_TIMEOUT, operation_timeout: OPERATION_TIMEOUT, keep_alive_timeout: KEEP_ALIVE_TIMEOUT, read_timeout: READ_TIMEOUT, write_timeout: WRITE_TIMEOUT, request_timeout: REQUEST_TIMEOUT, }, :headers_class => Class.new(Headers), :headers => {}, :window_size => WINDOW_SIZE, :buffer_size => BUFFER_SIZE, :body_threshold_size => MAX_BODY_THRESHOLD_SIZE, :request_class => Class.new(Request), :response_class => Class.new(Response), :request_body_class => Class.new(Request::Body), :response_body_class => Class.new(Response::Body), :connection_class => Class.new(Connection), :options_class => Class.new(self), :transport => nil, :addresses => nil, :persistent => false, :resolver_class => (ENV["HTTPX_RESOLVER"] || :native).to_sym, :resolver_options => { cache: true }, :ip_families => ip_address_families, }.freeze  
KEEP_ALIVE_TIMEOUT = 20  
MAX_BODY_THRESHOLD_SIZE = (1 << 10) * 112  
OTHER_LOOKUP = ->(obj, k, ivar_map) { case obj when Hash obj[ivar_map[k]] else obj.instance_variable_get(k) end }  
REQUEST_BODY_IVARS = %i[@headers].freeze  
REQUEST_TIMEOUT = OPERATION_TIMEOUT = nil  
SETTINGS_TIMEOUT = 10  
WINDOW_SIZE = 1 << 14  

Public Class methods

method_added(meth)
[show source]
   # File lib/httpx/options.rb
78 def method_added(meth)
79   super
80 
81   return unless meth =~ /^option_(.+)$/
82 
83   optname = Regexp.last_match(1).to_sym
84 
85   attr_reader(optname)
86 end
new(options = {})
[show source]
   # File lib/httpx/options.rb
70 def new(options = {})
71   # let enhanced options go through
72   return options if self == Options && options.class < self
73   return options if options.is_a?(self)
74 
75   super
76 end
new(options = {})

creates a new options instance from a given hash, which optionally define the following:

:debug

an object which log messages are written to (must respond to <<)

:debug_level

the log level of messages (can be 1, 2, or 3).

:ssl

a hash of options which can be set as params of OpenSSL::SSL::SSLContext (see HTTPX::IO::SSL)

:http2_settings

a hash of options to be passed to a HTTP2::Connection (ex: { max_concurrent_streams: 2 })

:fallback_protocol

version of HTTP protocol to use by default in the absence of protocol negotiation like ALPN (defaults to "http/1.1")

:supported_compression_formats

list of compressions supported by the transcoder layer (defaults to %w[gzip deflate]).

:decompress_response_body

whether to auto-decompress response body (defaults to true).

:compress_request_body

whether to auto-decompress response body (defaults to true)

:timeout

hash of timeout configurations (supports :connect_timeout, :settings_timeout, :operation_timeout, :keep_alive_timeout, :read_timeout, :write_timeout and :request_timeout

:headers

hash of HTTP headers (ex: { "x-custom-foo" => "bar" })

:window_size

number of bytes to read from a socket

:buffer_size

internal read and write buffer size in bytes

:body_threshold_size

maximum size in bytes of response payload that is buffered in memory.

:request_class

class used to instantiate a request

:response_class

class used to instantiate a response

:headers_class

class used to instantiate headers

:request_body_class

class used to instantiate a request body

:response_body_class

class used to instantiate a response body

:connection_class

class used to instantiate connections

:options_class

class used to instantiate options

:transport

type of transport to use (set to “unix” for UNIX sockets)

:addresses

bucket of peer addresses (can be a list of IP addresses, a hash of domain to list of adddresses; paths should be used for UNIX sockets instead)

:io

open socket, or domain/ip-to-socket hash, which requests should be sent to

:persistent

whether to persist connections in between requests (defaults to true)

:resolver_class

which resolver to use (defaults to :native, can also be :system<tt> for using getaddrinfo or <tt>:https for DoH resolver, or a custom class)

:resolver_options

hash of options passed to the resolver

:ip_families

which socket families are supported (system-dependent)

:origin

HTTP origin to set on requests with relative path (ex: “api.serv.com”)

:base_path

path to prefix given relative paths with (ex: “/v2”)

:max_concurrent_requests

max number of requests which can be set concurrently

:max_requests

max number of requests which can be made on socket before it reconnects.

This list of options are enhanced with each loaded plugin, see the plugin docs for details.

[show source]
    # File lib/httpx/options.rb
129 def initialize(options = {})
130   do_initialize(options)
131   freeze
132 end

Public Instance methods

==(other)
[show source]
    # File lib/httpx/options.rb
230 def ==(other)
231   super || options_equals?(other)
232 end
extend_with_plugin_classes(pl)
[show source]
    # File lib/httpx/options.rb
299 def extend_with_plugin_classes(pl)
300   if defined?(pl::RequestMethods) || defined?(pl::RequestClassMethods)
301     @request_class = @request_class.dup
302     @request_class.__send__(:include, pl::RequestMethods) if defined?(pl::RequestMethods)
303     @request_class.extend(pl::RequestClassMethods) if defined?(pl::RequestClassMethods)
304   end
305   if defined?(pl::ResponseMethods) || defined?(pl::ResponseClassMethods)
306     @response_class = @response_class.dup
307     @response_class.__send__(:include, pl::ResponseMethods) if defined?(pl::ResponseMethods)
308     @response_class.extend(pl::ResponseClassMethods) if defined?(pl::ResponseClassMethods)
309   end
310   if defined?(pl::HeadersMethods) || defined?(pl::HeadersClassMethods)
311     @headers_class = @headers_class.dup
312     @headers_class.__send__(:include, pl::HeadersMethods) if defined?(pl::HeadersMethods)
313     @headers_class.extend(pl::HeadersClassMethods) if defined?(pl::HeadersClassMethods)
314   end
315   if defined?(pl::RequestBodyMethods) || defined?(pl::RequestBodyClassMethods)
316     @request_body_class = @request_body_class.dup
317     @request_body_class.__send__(:include, pl::RequestBodyMethods) if defined?(pl::RequestBodyMethods)
318     @request_body_class.extend(pl::RequestBodyClassMethods) if defined?(pl::RequestBodyClassMethods)
319   end
320   if defined?(pl::ResponseBodyMethods) || defined?(pl::ResponseBodyClassMethods)
321     @response_body_class = @response_body_class.dup
322     @response_body_class.__send__(:include, pl::ResponseBodyMethods) if defined?(pl::ResponseBodyMethods)
323     @response_body_class.extend(pl::ResponseBodyClassMethods) if defined?(pl::ResponseBodyClassMethods)
324   end
325   if defined?(pl::ConnectionMethods)
326     @connection_class = @connection_class.dup
327     @connection_class.__send__(:include, pl::ConnectionMethods)
328   end
329   return unless defined?(pl::OptionsMethods)
330 
331   @options_class = @options_class.dup
332   @options_class.__send__(:include, pl::OptionsMethods)
333 end
freeze()
[show source]
    # File lib/httpx/options.rb
134 def freeze
135   super
136   @origin.freeze
137   @base_path.freeze
138   @timeout.freeze
139   @headers.freeze
140   @addresses.freeze
141   @supported_compression_formats.freeze
142 end
merge(other)
[show source]
    # File lib/httpx/options.rb
257 def merge(other)
258   ivar_map = nil
259   other_ivars = case other
260                 when Hash
261                   ivar_map = other.keys.to_h { |k| [:"@#{k}", k] }
262                   ivar_map.keys
263                 else
264                   other.instance_variables
265   end
266 
267   return self if other_ivars.empty?
268 
269   return self if other_ivars.all? { |ivar| instance_variable_get(ivar) == OTHER_LOOKUP[other, ivar, ivar_map] }
270 
271   opts = dup
272 
273   other_ivars.each do |ivar|
274     v = OTHER_LOOKUP[other, ivar, ivar_map]
275 
276     unless v
277       opts.instance_variable_set(ivar, v)
278       next
279     end
280 
281     v = opts.__send__(:"option_#{ivar[1..-1]}", v)
282 
283     orig_v = instance_variable_get(ivar)
284 
285     v = orig_v.merge(v) if orig_v.respond_to?(:merge) && v.respond_to?(:merge)
286 
287     opts.instance_variable_set(ivar, v)
288   end
289 
290   opts
291 end
option_addresses(value)
[show source]
    # File lib/httpx/options.rb
206 def option_addresses(value)
207   Array(value)
208 end
option_base_path(value)
[show source]
    # File lib/httpx/options.rb
148 def option_base_path(value)
149   String(value)
150 end
option_body_threshold_size(value)
[show source]
    # File lib/httpx/options.rb
192 def option_body_threshold_size(value)
193   bytes = Integer(value)
194   raise TypeError, ":body_threshold_size must be positive" unless bytes.positive?
195 
196   bytes
197 end
option_buffer_size(value)
[show source]
    # File lib/httpx/options.rb
184 def option_buffer_size(value)
185   value = Integer(value)
186 
187   raise TypeError, ":buffer_size must be positive" unless value.positive?
188 
189   value
190 end
option_headers(value)
[show source]
    # File lib/httpx/options.rb
152 def option_headers(value)
153   headers_class.new(value)
154 end
option_ip_families(value)
[show source]
    # File lib/httpx/options.rb
210 def option_ip_families(value)
211   Array(value)
212 end
option_max_concurrent_requests(value)
[show source]
    # File lib/httpx/options.rb
164 def option_max_concurrent_requests(value)
165   raise TypeError, ":max_concurrent_requests must be positive" unless value.positive?
166 
167   value
168 end
option_max_requests(value)
[show source]
    # File lib/httpx/options.rb
170 def option_max_requests(value)
171   raise TypeError, ":max_requests must be positive" unless value.positive?
172 
173   value
174 end
option_origin(value)
[show source]
    # File lib/httpx/options.rb
144 def option_origin(value)
145   URI(value)
146 end
option_supported_compression_formats(value)
[show source]
    # File lib/httpx/options.rb
160 def option_supported_compression_formats(value)
161   Array(value).map(&:to_s)
162 end
option_timeout(value)
[show source]
    # File lib/httpx/options.rb
156 def option_timeout(value)
157   Hash[value]
158 end
option_transport(value)
[show source]
    # File lib/httpx/options.rb
199 def option_transport(value)
200   transport = value.to_s
201   raise TypeError, "#{transport} is an unsupported transport type" unless %w[unix].include?(transport)
202 
203   transport
204 end
option_window_size(value)
[show source]
    # File lib/httpx/options.rb
176 def option_window_size(value)
177   value = Integer(value)
178 
179   raise TypeError, ":window_size must be positive" unless value.positive?
180 
181   value
182 end
options_equals?(other, ignore_ivars = REQUEST_BODY_IVARS)
[show source]
    # File lib/httpx/options.rb
234 def options_equals?(other, ignore_ivars = REQUEST_BODY_IVARS)
235   # headers and other request options do not play a role, as they are
236   # relevant only for the request.
237   ivars = instance_variables - ignore_ivars
238   other_ivars = other.instance_variables - ignore_ivars
239 
240   return false if ivars.size != other_ivars.size
241 
242   return false if ivars.sort != other_ivars.sort
243 
244   ivars.all? do |ivar|
245     instance_variable_get(ivar) == other.instance_variable_get(ivar)
246   end
247 end
to_hash()
[show source]
    # File lib/httpx/options.rb
293 def to_hash
294   instance_variables.each_with_object({}) do |ivar, hs|
295     hs[ivar[1..-1].to_sym] = instance_variable_get(ivar)
296   end
297 end