Contains a set of options which are passed and shared across from session to its requests or responses.
Methods
Public Class
Public Instance
- ==
- extend_with_plugin_classes
- freeze
- merge
- option_addresses
- option_base_path
- option_body_threshold_size
- option_buffer_size
- option_headers
- option_ip_families
- option_max_concurrent_requests
- option_max_requests
- option_origin
- option_supported_compression_formats
- option_timeout
- option_transport
- option_window_size
- options_equals?
- to_hash
Constants
BUFFER_SIZE | = | 1 << 14 | ||
CLOSE_HANDSHAKE_TIMEOUT | = | 10 | ||
CONNECT_TIMEOUT | = | READ_TIMEOUT = WRITE_TIMEOUT = 60 | ||
DEFAULT_OPTIONS | = | { :max_requests => Float::INFINITY, :debug => nil, :debug_level => (ENV["HTTPX_DEBUG"] || 1).to_i, :ssl => EMPTY_HASH, :http2_settings => { settings_enable_push: 0 }.freeze, :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, &SET_TEMPORARY_NAME), :headers => {}, :window_size => WINDOW_SIZE, :buffer_size => BUFFER_SIZE, :body_threshold_size => MAX_BODY_THRESHOLD_SIZE, :request_class => Class.new(Request, &SET_TEMPORARY_NAME), :response_class => Class.new(Response, &SET_TEMPORARY_NAME), :request_body_class => Class.new(Request::Body, &SET_TEMPORARY_NAME), :response_body_class => Class.new(Response::Body, &SET_TEMPORARY_NAME), :pool_class => Class.new(Pool, &SET_TEMPORARY_NAME), :connection_class => Class.new(Connection, &SET_TEMPORARY_NAME), :options_class => Class.new(self, &SET_TEMPORARY_NAME), :transport => nil, :addresses => nil, :persistent => false, :resolver_class => (ENV["HTTPX_RESOLVER"] || :native).to_sym, :resolver_options => { cache: true }.freeze, :pool_options => EMPTY_HASH, :ip_families => ip_address_families, :close_on_fork => false, }.freeze | ||
KEEP_ALIVE_TIMEOUT | = | 20 | ||
MAX_BODY_THRESHOLD_SIZE | = | (1 << 10) * 112 | ||
REQUEST_BODY_IVARS | = | %i[@headers].freeze | ||
REQUEST_TIMEOUT | = | OPERATION_TIMEOUT = nil | ||
SETTINGS_TIMEOUT | = | 10 | ||
SET_TEMPORARY_NAME | = | ->(mod, pl = nil) do if mod.respond_to?(:set_temporary_name) # ruby 3.4 only name = mod.name || "#{mod.superclass.name}(plugin)" name = "#{name}/#{pl}" if pl mod.set_temporary_name(name) end end | ||
WINDOW_SIZE | = | 1 << 14 |
Public Class methods
# File lib/httpx/options.rb 89 def method_added(meth) 90 super 91 92 return unless meth =~ /^option_(.+)$/ 93 94 optname = Regexp.last_match(1).to_sym 95 96 attr_reader(optname) 97 end
# File lib/httpx/options.rb 81 def new(options = {}) 82 # let enhanced options go through 83 return options if self == Options && options.class < self 84 return options if options.is_a?(self) 85 86 super 87 end
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: |
:fallback_protocol |
version of HTTP protocol to use by default in the absence of protocol negotiation like ALPN (defaults to |
:supported_compression_formats |
list of compressions supported by the transcoder layer (defaults to |
:decompress_response_body |
whether to auto-decompress response body (defaults to |
:compress_request_body |
whether to auto-decompress response body (defaults to |
:timeout |
hash of timeout configurations (supports |
:headers |
hash of HTTP headers (ex: |
: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 |
:pool_class |
class used to instantiate the session connection pool |
:options_class |
class used to instantiate options |
:transport |
type of transport to use (set to “unix” for |
: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 |
: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 |
:resolver_class |
which resolver to use (defaults to |
:resolver_options |
hash of options passed to the resolver. Accepted keys depend on the resolver type. |
:pool_options |
hash of options passed to the connection pool (See Pool#initialize). |
: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. |
:close_on_fork |
whether the session automatically closes when the process is fork (defaults to |
This list of options are enhanced with each loaded plugin, see the plugin docs for details.
# File lib/httpx/options.rb 144 def initialize(options = {}) 145 do_initialize(options) 146 freeze 147 end
Public Instance methods
# File lib/httpx/options.rb 246 def ==(other) 247 super || options_equals?(other) 248 end
# File lib/httpx/options.rb 307 def extend_with_plugin_classes(pl) 308 if defined?(pl::RequestMethods) || defined?(pl::RequestClassMethods) 309 @request_class = @request_class.dup 310 SET_TEMPORARY_NAME[@request_class, pl] 311 @request_class.__send__(:include, pl::RequestMethods) if defined?(pl::RequestMethods) 312 @request_class.extend(pl::RequestClassMethods) if defined?(pl::RequestClassMethods) 313 end 314 if defined?(pl::ResponseMethods) || defined?(pl::ResponseClassMethods) 315 @response_class = @response_class.dup 316 SET_TEMPORARY_NAME[@response_class, pl] 317 @response_class.__send__(:include, pl::ResponseMethods) if defined?(pl::ResponseMethods) 318 @response_class.extend(pl::ResponseClassMethods) if defined?(pl::ResponseClassMethods) 319 end 320 if defined?(pl::HeadersMethods) || defined?(pl::HeadersClassMethods) 321 @headers_class = @headers_class.dup 322 SET_TEMPORARY_NAME[@headers_class, pl] 323 @headers_class.__send__(:include, pl::HeadersMethods) if defined?(pl::HeadersMethods) 324 @headers_class.extend(pl::HeadersClassMethods) if defined?(pl::HeadersClassMethods) 325 end 326 if defined?(pl::RequestBodyMethods) || defined?(pl::RequestBodyClassMethods) 327 @request_body_class = @request_body_class.dup 328 SET_TEMPORARY_NAME[@request_body_class, pl] 329 @request_body_class.__send__(:include, pl::RequestBodyMethods) if defined?(pl::RequestBodyMethods) 330 @request_body_class.extend(pl::RequestBodyClassMethods) if defined?(pl::RequestBodyClassMethods) 331 end 332 if defined?(pl::ResponseBodyMethods) || defined?(pl::ResponseBodyClassMethods) 333 @response_body_class = @response_body_class.dup 334 SET_TEMPORARY_NAME[@response_body_class, pl] 335 @response_body_class.__send__(:include, pl::ResponseBodyMethods) if defined?(pl::ResponseBodyMethods) 336 @response_body_class.extend(pl::ResponseBodyClassMethods) if defined?(pl::ResponseBodyClassMethods) 337 end 338 if defined?(pl::PoolMethods) 339 @pool_class = @pool_class.dup 340 SET_TEMPORARY_NAME[@pool_class, pl] 341 @pool_class.__send__(:include, pl::PoolMethods) 342 end 343 if defined?(pl::ConnectionMethods) 344 @connection_class = @connection_class.dup 345 SET_TEMPORARY_NAME[@connection_class, pl] 346 @connection_class.__send__(:include, pl::ConnectionMethods) 347 end 348 return unless defined?(pl::OptionsMethods) 349 350 @options_class = @options_class.dup 351 @options_class.__send__(:include, pl::OptionsMethods) 352 end
# File lib/httpx/options.rb 149 def freeze 150 super 151 @origin.freeze 152 @base_path.freeze 153 @timeout.freeze 154 @headers.freeze 155 @addresses.freeze 156 @supported_compression_formats.freeze 157 end
# File lib/httpx/options.rb 265 def merge(other) 266 ivar_map = nil 267 other_ivars = case other 268 when Hash 269 ivar_map = other.keys.to_h { |k| [:"@#{k}", k] } 270 ivar_map.keys 271 else 272 other.instance_variables 273 end 274 275 return self if other_ivars.empty? 276 277 return self if other_ivars.all? { |ivar| instance_variable_get(ivar) == access_option(other, ivar, ivar_map) } 278 279 opts = dup 280 281 other_ivars.each do |ivar| 282 v = access_option(other, ivar, ivar_map) 283 284 unless v 285 opts.instance_variable_set(ivar, v) 286 next 287 end 288 289 v = opts.__send__(:"option_#{ivar[1..-1]}", v) 290 291 orig_v = instance_variable_get(ivar) 292 293 v = orig_v.merge(v) if orig_v.respond_to?(:merge) && v.respond_to?(:merge) 294 295 opts.instance_variable_set(ivar, v) 296 end 297 298 opts 299 end
# File lib/httpx/options.rb 221 def option_addresses(value) 222 Array(value) 223 end
# File lib/httpx/options.rb 163 def option_base_path(value) 164 String(value) 165 end
# File lib/httpx/options.rb 207 def option_body_threshold_size(value) 208 bytes = Integer(value) 209 raise TypeError, ":body_threshold_size must be positive" unless bytes.positive? 210 211 bytes 212 end
# File lib/httpx/options.rb 199 def option_buffer_size(value) 200 value = Integer(value) 201 202 raise TypeError, ":buffer_size must be positive" unless value.positive? 203 204 value 205 end
# File lib/httpx/options.rb 167 def option_headers(value) 168 headers_class.new(value) 169 end
# File lib/httpx/options.rb 225 def option_ip_families(value) 226 Array(value) 227 end
# File lib/httpx/options.rb 179 def option_max_concurrent_requests(value) 180 raise TypeError, ":max_concurrent_requests must be positive" unless value.positive? 181 182 value 183 end
# File lib/httpx/options.rb 185 def option_max_requests(value) 186 raise TypeError, ":max_requests must be positive" unless value.positive? 187 188 value 189 end
# File lib/httpx/options.rb 159 def option_origin(value) 160 URI(value) 161 end
# File lib/httpx/options.rb 175 def option_supported_compression_formats(value) 176 Array(value).map(&:to_s) 177 end
# File lib/httpx/options.rb 171 def option_timeout(value) 172 Hash[value] 173 end
# File lib/httpx/options.rb 214 def option_transport(value) 215 transport = value.to_s 216 raise TypeError, "#{transport} is an unsupported transport type" unless %w[unix].include?(transport) 217 218 transport 219 end
# File lib/httpx/options.rb 191 def option_window_size(value) 192 value = Integer(value) 193 194 raise TypeError, ":window_size must be positive" unless value.positive? 195 196 value 197 end
# File lib/httpx/options.rb 250 def options_equals?(other, ignore_ivars = REQUEST_BODY_IVARS) 251 # headers and other request options do not play a role, as they are 252 # relevant only for the request. 253 ivars = instance_variables - ignore_ivars 254 other_ivars = other.instance_variables - ignore_ivars 255 256 return false if ivars.size != other_ivars.size 257 258 return false if ivars.sort != other_ivars.sort 259 260 ivars.all? do |ivar| 261 instance_variable_get(ivar) == other.instance_variable_get(ivar) 262 end 263 end
# File lib/httpx/options.rb 301 def to_hash 302 instance_variables.each_with_object({}) do |ivar, hs| 303 hs[ivar[1..-1].to_sym] = instance_variable_get(ivar) 304 end 305 end