httpx 1.2.6 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/doc/release_notes/1_3_0.md +18 -0
  3. data/doc/release_notes/1_3_1.md +17 -0
  4. data/lib/httpx/adapters/datadog.rb +8 -4
  5. data/lib/httpx/adapters/faraday.rb +2 -1
  6. data/lib/httpx/adapters/webmock.rb +1 -1
  7. data/lib/httpx/connection/http1.rb +11 -7
  8. data/lib/httpx/connection/http2.rb +15 -11
  9. data/lib/httpx/connection.rb +51 -24
  10. data/lib/httpx/io/tcp.rb +1 -1
  11. data/lib/httpx/io/unix.rb +1 -1
  12. data/lib/httpx/options.rb +4 -7
  13. data/lib/httpx/plugins/aws_sdk_authentication.rb +3 -0
  14. data/lib/httpx/plugins/aws_sigv4.rb +5 -1
  15. data/lib/httpx/plugins/circuit_breaker.rb +10 -0
  16. data/lib/httpx/plugins/cookies.rb +9 -6
  17. data/lib/httpx/plugins/digest_auth.rb +3 -0
  18. data/lib/httpx/plugins/expect.rb +5 -0
  19. data/lib/httpx/plugins/follow_redirects.rb +65 -29
  20. data/lib/httpx/plugins/grpc.rb +2 -2
  21. data/lib/httpx/plugins/h2c.rb +1 -1
  22. data/lib/httpx/plugins/oauth.rb +1 -1
  23. data/lib/httpx/plugins/proxy/http.rb +9 -4
  24. data/lib/httpx/plugins/proxy/socks4.rb +1 -1
  25. data/lib/httpx/plugins/proxy/socks5.rb +1 -1
  26. data/lib/httpx/plugins/proxy.rb +24 -13
  27. data/lib/httpx/plugins/retries.rb +25 -4
  28. data/lib/httpx/plugins/ssrf_filter.rb +4 -1
  29. data/lib/httpx/pool/synch_pool.rb +93 -0
  30. data/lib/httpx/pool.rb +1 -1
  31. data/lib/httpx/request/body.rb +37 -41
  32. data/lib/httpx/request.rb +42 -13
  33. data/lib/httpx/resolver/https.rb +7 -5
  34. data/lib/httpx/resolver/native.rb +1 -1
  35. data/lib/httpx/resolver/resolver.rb +1 -1
  36. data/lib/httpx/resolver/system.rb +1 -1
  37. data/lib/httpx/response.rb +2 -2
  38. data/lib/httpx/session.rb +34 -19
  39. data/lib/httpx/timers.rb +1 -1
  40. data/lib/httpx/version.rb +1 -1
  41. data/sig/chainable.rbs +2 -2
  42. data/sig/connection/http1.rbs +2 -2
  43. data/sig/connection/http2.rbs +17 -17
  44. data/sig/connection.rbs +10 -4
  45. data/sig/httpx.rbs +3 -3
  46. data/sig/io/tcp.rbs +1 -1
  47. data/sig/io/unix.rbs +1 -1
  48. data/sig/options.rbs +1 -13
  49. data/sig/plugins/follow_redirects.rbs +1 -1
  50. data/sig/plugins/proxy/http.rbs +3 -0
  51. data/sig/plugins/proxy.rbs +2 -0
  52. data/sig/plugins/push_promise.rbs +3 -3
  53. data/sig/pool.rbs +1 -1
  54. data/sig/request/body.rbs +1 -3
  55. data/sig/request.rbs +2 -1
  56. data/sig/resolver/resolver.rbs +2 -2
  57. data/sig/response.rbs +1 -1
  58. data/sig/session.rbs +11 -6
  59. metadata +11 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0fc8cbe89a9d05f24f615e5de7874c65147954cc8d06524955fea9d0e4ef5598
4
- data.tar.gz: e97b5febb579cd1c5e035faef9cf0368ab7148882d2ed95a0454b52fd0d31621
3
+ metadata.gz: 0162427fe818aafee88a35a12a821cf4f1016701f4513835c91556a7e8579e9e
4
+ data.tar.gz: f559d77efcdbf0e557c28c9a012cb67f45a95de8f8c2fac521800679ea30dc31
5
5
  SHA512:
6
- metadata.gz: 55631972d465e4ea086dcaced389f7998380f052c369004f45d286d0502c612289dc5a19deff7ca26c9c0cfd6e2c4926ba5e32744c366f18884f97aedb3ad5bf
7
- data.tar.gz: 9eb1be90bceb56c335a84b180ae6c7fc065944ae1fd6dab17d9e4802c7fb62c7d3f34d3c98ba41a9cb1b8e503a929eb97cd8a667a9f536090ef266936efb81d9
6
+ metadata.gz: 1dd2fa825bdaef26137e8c5d993dcb426eab7897adc8570a343863e7842f3732948bdc827c58e1e361bb35b2c1d549b02d89051a592a836a51f39afb95a77263
7
+ data.tar.gz: 8a64f6fc512fd8fa60d7feeffff6447d3c8a4081fe6494873b4a527f425dad090ca84b810a2a91477b051a4dfeb0bbb12e0563ef37c20e8d5daab05f2a208138
@@ -0,0 +1,18 @@
1
+ # 1.3.0
2
+
3
+ ## Dependencies
4
+
5
+ `http-2` v1.0.0 is replacing `http-2-next` as the HTTP/2 parser.
6
+
7
+ `http-2-next` was forked from `http-2` 5 years ago; its improvements have been merged back to `http-2` recently though, so `http-2-next` willl therefore no longer be maintained.
8
+
9
+ ## Improvements
10
+
11
+ Request-specific options (`:params`, `:form`, `:json` and `:xml`) are now separately kept by the request, which allows them to share `HTTPX::Options`, and reduce the number of copying / allocations.
12
+
13
+ This means that `HTTPX::Options` will throw an error if you initialize an object which such keys; this should not happen, as this class is considered internal and you should not be using it directly.
14
+
15
+ ## Fixes
16
+
17
+ * support for the `datadog` gem v2.0.0 in its adapter has been unblocked, now that the gem has been released.
18
+ * loading the `:cookies` plugin was making the `Session#build_request` private.
@@ -0,0 +1,17 @@
1
+ # 1.3.1
2
+
3
+ ## Improvements
4
+
5
+ * `:request_timeout` will be applied to all HTTP interactions until the final responses returned to the caller. That includes:
6
+ * all redirect requests/responses (when using the `:follow_redirects` plugin)
7
+ * all retried requests/responses (when using the `:retries` plugin)
8
+ * intermediate requests (such as "100-continue")
9
+ * faraday adapter: allow further plugins of internal session (ex: `builder.adapter(:httpx) { |sess| sess.plugin(:follow_redirects) }...`)
10
+
11
+ ## Bugfixes
12
+
13
+ * fix connection leak on proxy auth failed (407) handling
14
+ * fix busy loop on deferred requests for the duration interval
15
+ * do not further enqueue deferred requests if they have terminated meanwhile.
16
+ * fix busy loop caused by coalescing connections when one of them is on the DNS resolution phase still.
17
+ * faraday adapter: on parallel mode, skip calling `on_complete` when not defined.
@@ -142,7 +142,7 @@ module Datadog::Tracing
142
142
  @configuration ||= Datadog.configuration.tracing[:httpx, @request.uri.host]
143
143
  end
144
144
 
145
- if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("2.0.0.beta1")
145
+ if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("2.0.0")
146
146
  def propagate_trace_http(digest, headers)
147
147
  Datadog::Tracing::Contrib::HTTP.inject(digest, headers)
148
148
  end
@@ -195,15 +195,19 @@ module Datadog::Tracing
195
195
  # that the tracing logic hasn't been injected yet; in such cases, the approximate
196
196
  # initial resolving time is collected from the connection, and used as span start time,
197
197
  # and the tracing object in inserted before the on response callback is called.
198
- def handle_error(error)
198
+ def handle_error(error, request = nil)
199
199
  return super unless Datadog::Tracing.enabled?
200
200
 
201
201
  return super unless error.respond_to?(:connection)
202
202
 
203
- @pending.each do |request|
204
- RequestTracer.new(request).call(error.connection.init_time)
203
+ @pending.each do |req|
204
+ next if request and request == req
205
+
206
+ RequestTracer.new(req).call(error.connection.init_time)
205
207
  end
206
208
 
209
+ RequestTracer.new(request).call(error.connection.init_time) if request
210
+
207
211
  super
208
212
  end
209
213
  end
@@ -30,6 +30,7 @@ module Faraday
30
30
  end
31
31
  @connection = @connection.plugin(OnDataPlugin) if env.request.stream_response?
32
32
 
33
+ @connection = @config_block.call(@connection) || @connection if @config_block
33
34
  @connection
34
35
  end
35
36
 
@@ -212,7 +213,7 @@ module Faraday
212
213
  Array(responses).each_with_index do |response, index|
213
214
  handler = @handlers[index]
214
215
  handler.on_response.call(response)
215
- handler.on_complete.call(handler.env)
216
+ handler.on_complete.call(handler.env) if handler.on_complete
216
217
  end
217
218
  end
218
219
  rescue ::HTTPX::TimeoutError => e
@@ -47,7 +47,7 @@ module WebMock
47
47
  end
48
48
 
49
49
  def build_error_response(request, exception)
50
- HTTPX::ErrorResponse.new(request, exception, request.options)
50
+ HTTPX::ErrorResponse.new(request, exception)
51
51
  end
52
52
  end
53
53
 
@@ -15,7 +15,7 @@ module HTTPX
15
15
  attr_accessor :max_concurrent_requests
16
16
 
17
17
  def initialize(buffer, options)
18
- @options = Options.new(options)
18
+ @options = options
19
19
  @max_concurrent_requests = @options.max_concurrent_requests || MAX_REQUESTS
20
20
  @max_requests = @options.max_requests
21
21
  @parser = Parser::HTTP1.new(self)
@@ -146,7 +146,7 @@ module HTTPX
146
146
 
147
147
  response << chunk
148
148
  rescue StandardError => e
149
- error_response = ErrorResponse.new(request, e, request.options)
149
+ error_response = ErrorResponse.new(request, e)
150
150
  request.response = error_response
151
151
  dispatch
152
152
  end
@@ -197,7 +197,7 @@ module HTTPX
197
197
  end
198
198
  end
199
199
 
200
- def handle_error(ex)
200
+ def handle_error(ex, request = nil)
201
201
  if (ex.is_a?(EOFError) || ex.is_a?(TimeoutError)) && @request && @request.response &&
202
202
  !@request.response.headers.key?("content-length") &&
203
203
  !@request.response.headers.key?("transfer-encoding")
@@ -211,11 +211,15 @@ module HTTPX
211
211
  if @pipelining
212
212
  catch(:called) { disable }
213
213
  else
214
- @requests.each do |request|
215
- emit(:error, request, ex)
214
+ @requests.each do |req|
215
+ next if request && request == req
216
+
217
+ emit(:error, req, ex)
216
218
  end
217
- @pending.each do |request|
218
- emit(:error, request, ex)
219
+ @pending.each do |req|
220
+ next if request && request == req
221
+
222
+ emit(:error, req, ex)
219
223
  end
220
224
  end
221
225
  end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "securerandom"
4
- require "http/2/next"
4
+ require "http/2"
5
5
 
6
6
  module HTTPX
7
7
  class Connection::HTTP2
8
8
  include Callbacks
9
9
  include Loggable
10
10
 
11
- MAX_CONCURRENT_REQUESTS = HTTP2Next::DEFAULT_MAX_CONCURRENT_STREAMS
11
+ MAX_CONCURRENT_REQUESTS = ::HTTP2::DEFAULT_MAX_CONCURRENT_STREAMS
12
12
 
13
13
  class Error < Error
14
14
  def initialize(id, code)
@@ -25,7 +25,7 @@ module HTTPX
25
25
  attr_reader :streams, :pending
26
26
 
27
27
  def initialize(buffer, options)
28
- @options = Options.new(options)
28
+ @options = options
29
29
  @settings = @options.http2_settings
30
30
  @pending = []
31
31
  @streams = {}
@@ -111,7 +111,7 @@ module HTTPX
111
111
  end
112
112
  handle(request, stream)
113
113
  true
114
- rescue HTTP2Next::Error::StreamLimitExceeded
114
+ rescue ::HTTP2::Error::StreamLimitExceeded
115
115
  @pending.unshift(request)
116
116
  end
117
117
 
@@ -123,7 +123,7 @@ module HTTPX
123
123
  end
124
124
  end
125
125
 
126
- def handle_error(ex)
126
+ def handle_error(ex, request = nil)
127
127
  if ex.instance_of?(TimeoutError) && !@handshake_completed && @connection.state != :closed
128
128
  @connection.goaway(:settings_timeout, "closing due to settings timeout")
129
129
  emit(:close_handshake)
@@ -131,11 +131,15 @@ module HTTPX
131
131
  settings_ex.set_backtrace(ex.backtrace)
132
132
  ex = settings_ex
133
133
  end
134
- @streams.each_key do |request|
135
- emit(:error, request, ex)
134
+ @streams.each_key do |req|
135
+ next if request && request == req
136
+
137
+ emit(:error, req, ex)
136
138
  end
137
- @pending.each do |request|
138
- emit(:error, request, ex)
139
+ @pending.each do |req|
140
+ next if request && request == req
141
+
142
+ emit(:error, req, ex)
139
143
  end
140
144
  end
141
145
 
@@ -168,7 +172,7 @@ module HTTPX
168
172
  end
169
173
 
170
174
  def init_connection
171
- @connection = HTTP2Next::Client.new(@settings)
175
+ @connection = ::HTTP2::Client.new(@settings)
172
176
  @connection.on(:frame, &method(:on_frame))
173
177
  @connection.on(:frame_sent, &method(:on_frame_sent))
174
178
  @connection.on(:frame_received, &method(:on_frame_received))
@@ -309,7 +313,7 @@ module HTTPX
309
313
  if error
310
314
  ex = Error.new(stream.id, error)
311
315
  ex.set_backtrace(caller)
312
- response = ErrorResponse.new(request, ex, request.options)
316
+ response = ErrorResponse.new(request, ex)
313
317
  request.response = response
314
318
  emit(:response, request, response)
315
319
  else
@@ -48,6 +48,8 @@ module HTTPX
48
48
  attr_accessor :family
49
49
 
50
50
  def initialize(uri, options)
51
+ @origins = [uri.origin]
52
+ @origin = Utils.to_uri(uri.origin)
51
53
  @options = Options.new(options)
52
54
  @type = initialize_type(uri, @options)
53
55
  @origins = [uri.origin]
@@ -337,7 +339,7 @@ module HTTPX
337
339
  #
338
340
  loop do
339
341
  siz = @io.read(@window_size, @read_buffer)
340
- log(level: 3, color: :cyan) { "IO READ: #{siz} bytes..." }
342
+ log(level: 3, color: :cyan) { "IO READ: #{siz} bytes... (wsize: #{@window_size}, rbuffer: #{@read_buffer.bytesize})" }
341
343
  unless siz
342
344
  ex = EOFError.new("descriptor closed")
343
345
  ex.set_backtrace(caller)
@@ -504,7 +506,7 @@ module HTTPX
504
506
  when MisdirectedRequestError
505
507
  emit(:misdirected, request)
506
508
  else
507
- response = ErrorResponse.new(request, ex, @options)
509
+ response = ErrorResponse.new(request, ex)
508
510
  request.response = response
509
511
  request.emit(:response, response)
510
512
  end
@@ -530,7 +532,7 @@ module HTTPX
530
532
  connecting? && callbacks_for?(:connect_error) ? emit(:connect_error, error) : handle_error(error)
531
533
  @state = :closed
532
534
  emit(:close)
533
- rescue TLSError, HTTP2Next::Error::ProtocolError, HTTP2Next::Error::HandshakeError => e
535
+ rescue TLSError, ::HTTP2::Error::ProtocolError, ::HTTP2::Error::HandshakeError => e
534
536
  # connect errors, exit gracefully
535
537
  handle_error(e)
536
538
  connecting? && callbacks_for?(:connect_error) ? emit(:connect_error, e) : handle_error(e)
@@ -560,6 +562,9 @@ module HTTPX
560
562
  emit(:open)
561
563
  when :inactive
562
564
  return unless @state == :open
565
+
566
+ # do not deactivate connection in use
567
+ return if @inflight.positive?
563
568
  when :closing
564
569
  return unless @state == :idle || @state == :open
565
570
 
@@ -636,7 +641,7 @@ module HTTPX
636
641
  end
637
642
  end
638
643
 
639
- def on_error(error)
644
+ def on_error(error, request = nil)
640
645
  if error.instance_of?(TimeoutError)
641
646
 
642
647
  # inactive connections do not contribute to the select loop, therefore
@@ -650,39 +655,59 @@ module HTTPX
650
655
 
651
656
  error = error.to_connection_error if connecting?
652
657
  end
653
- handle_error(error)
658
+ handle_error(error, request)
654
659
  reset
655
660
  end
656
661
 
657
- def handle_error(error)
658
- parser.handle_error(error) if @parser && parser.respond_to?(:handle_error)
659
- while (request = @pending.shift)
660
- response = ErrorResponse.new(request, error, request.options)
661
- request.response = response
662
- request.emit(:response, response)
662
+ def handle_error(error, request = nil)
663
+ parser.handle_error(error, request) if @parser && parser.respond_to?(:handle_error)
664
+ while (req = @pending.shift)
665
+ next if request && req == request
666
+
667
+ response = ErrorResponse.new(req, error)
668
+ req.response = response
669
+ req.emit(:response, response)
663
670
  end
671
+
672
+ return unless request
673
+
674
+ response = ErrorResponse.new(request, error)
675
+ request.response = response
676
+ request.emit(:response, response)
664
677
  end
665
678
 
666
679
  def set_request_timeouts(request)
667
- write_timeout = request.write_timeout
680
+ set_request_write_timeout(request)
681
+ set_request_read_timeout(request)
682
+ set_request_request_timeout(request)
683
+ end
684
+
685
+ def set_request_read_timeout(request)
668
686
  read_timeout = request.read_timeout
669
- request_timeout = request.request_timeout
670
687
 
671
- unless write_timeout.nil? || write_timeout.infinite?
672
- set_request_timeout(request, write_timeout, :headers, %i[done response]) do
673
- write_timeout_callback(request, write_timeout)
674
- end
688
+ return if read_timeout.nil? || read_timeout.infinite?
689
+
690
+ set_request_timeout(request, read_timeout, :done, :response) do
691
+ read_timeout_callback(request, read_timeout)
675
692
  end
693
+ end
676
694
 
677
- unless read_timeout.nil? || read_timeout.infinite?
678
- set_request_timeout(request, read_timeout, :done, :response) do
679
- read_timeout_callback(request, read_timeout)
680
- end
695
+ def set_request_write_timeout(request)
696
+ write_timeout = request.write_timeout
697
+
698
+ return if write_timeout.nil? || write_timeout.infinite?
699
+
700
+ set_request_timeout(request, write_timeout, :headers, %i[done response]) do
701
+ write_timeout_callback(request, write_timeout)
681
702
  end
703
+ end
704
+
705
+ def set_request_request_timeout(request)
706
+ request_timeout = request.request_timeout
682
707
 
683
708
  return if request_timeout.nil? || request_timeout.infinite?
684
709
 
685
- set_request_timeout(request, request_timeout, :headers, :response) do
710
+ set_request_timeout(request, request_timeout, :headers, :complete) do
686
711
  read_timeout_callback(request, request_timeout, RequestTimeoutError)
687
712
  end
688
713
  end
@@ -692,7 +717,8 @@ module HTTPX
692
717
 
693
718
  @write_buffer.clear
694
719
  error = WriteTimeoutError.new(request, nil, write_timeout)
695
- on_error(error)
720
+
721
+ on_error(error, request)
696
722
  end
697
723
 
698
724
  def read_timeout_callback(request, read_timeout, error_type = ReadTimeoutError)
@@ -702,7 +728,8 @@ module HTTPX
702
728
 
703
729
  @write_buffer.clear
704
730
  error = error_type.new(request, request.response, read_timeout)
705
- on_error(error)
731
+
732
+ on_error(error, request)
706
733
  end
707
734
 
708
735
  def set_request_timeout(request, timeout, start_event, finish_events, &callback)
data/lib/httpx/io/tcp.rb CHANGED
@@ -17,7 +17,7 @@ module HTTPX
17
17
  @state = :idle
18
18
  @addresses = []
19
19
  @hostname = origin.host
20
- @options = Options.new(options)
20
+ @options = options
21
21
  @fallback_protocol = @options.fallback_protocol
22
22
  @port = origin.port
23
23
  @interests = :w
data/lib/httpx/io/unix.rb CHANGED
@@ -12,7 +12,7 @@ module HTTPX
12
12
  @addresses = []
13
13
  @hostname = origin.host
14
14
  @state = :idle
15
- @options = Options.new(options)
15
+ @options = options
16
16
  @fallback_protocol = @options.fallback_protocol
17
17
  if @options.io
18
18
  @io = case @options.io
data/lib/httpx/options.rb CHANGED
@@ -91,7 +91,7 @@ module HTTPX
91
91
  # :debug :: an object which log messages are written to (must respond to <tt><<</tt>)
92
92
  # :debug_level :: the log level of messages (can be 1, 2, or 3).
93
93
  # :ssl :: a hash of options which can be set as params of OpenSSL::SSL::SSLContext (see HTTPX::IO::SSL)
94
- # :http2_settings :: a hash of options to be passed to a HTTP2Next::Connection (ex: <tt>{ max_concurrent_streams: 2 }</tt>)
94
+ # :http2_settings :: a hash of options to be passed to a HTTP2::Connection (ex: <tt>{ max_concurrent_streams: 2 }</tt>)
95
95
  # :fallback_protocol :: version of HTTP protocol to use by default in the absence of protocol negotiation
96
96
  # like ALPN (defaults to <tt>"http/1.1"</tt>)
97
97
  # :supported_compression_formats :: list of compressions supported by the transcoder layer (defaults to <tt>%w[gzip deflate]</tt>).
@@ -124,10 +124,6 @@ module HTTPX
124
124
  # :base_path :: path to prefix given relative paths with (ex: "/v2")
125
125
  # :max_concurrent_requests :: max number of requests which can be set concurrently
126
126
  # :max_requests :: max number of requests which can be made on socket before it reconnects.
127
- # :params :: hash or array of key-values which will be encoded and set in the query string of request uris.
128
- # :form :: hash of array of key-values which will be form-or-multipart-encoded in requests body payload.
129
- # :json :: hash of array of key-values which will be JSON-encoded in requests body payload.
130
- # :xml :: Nokogiri XML nodes which will be encoded in requests body payload.
131
127
  #
132
128
  # This list of options are enhanced with each loaded plugin, see the plugin docs for details.
133
129
  def initialize(options = {})
@@ -216,7 +212,7 @@ module HTTPX
216
212
  end
217
213
 
218
214
  %i[
219
- params form json xml body ssl http2_settings
215
+ ssl http2_settings
220
216
  request_class response_class headers_class request_body_class
221
217
  response_body_class connection_class options_class
222
218
  io fallback_protocol debug debug_level resolver_class resolver_options
@@ -224,11 +220,12 @@ module HTTPX
224
220
  persistent
225
221
  ].each do |method_name|
226
222
  class_eval(<<-OUT, __FILE__, __LINE__ + 1)
223
+ # sets +v+ as the value of #{method_name}
227
224
  def option_#{method_name}(v); v; end # def option_smth(v); v; end
228
225
  OUT
229
226
  end
230
227
 
231
- REQUEST_BODY_IVARS = %i[@headers @params @form @xml @json @body].freeze
228
+ REQUEST_BODY_IVARS = %i[@headers].freeze
232
229
 
233
230
  def ==(other)
234
231
  super || options_equals?(other)
@@ -72,6 +72,9 @@ module HTTPX
72
72
  end
73
73
  end
74
74
 
75
+ # adds support for the following options:
76
+ #
77
+ # :aws_profile :: AWS account profile to retrieve credentials from.
75
78
  module OptionsMethods
76
79
  def option_aws_profile(value)
77
80
  String(value)
@@ -12,6 +12,7 @@ module HTTPX
12
12
  module AWSSigV4
13
13
  Credentials = Struct.new(:username, :password, :security_token)
14
14
 
15
+ # Signs requests using the AWS sigv4 signing.
15
16
  class Signer
16
17
  def initialize(
17
18
  service:,
@@ -149,6 +150,9 @@ module HTTPX
149
150
  end
150
151
  end
151
152
 
153
+ # adds support for the following options:
154
+ #
155
+ # :sigv4_signer :: instance of HTTPX::Plugins::AWSSigV4 used to sign requests.
152
156
  module OptionsMethods
153
157
  def option_sigv4_signer(value)
154
158
  value.is_a?(Signer) ? value : Signer.new(value)
@@ -160,7 +164,7 @@ module HTTPX
160
164
  with(sigv4_signer: Signer.new(**options))
161
165
  end
162
166
 
163
- def build_request(*, _)
167
+ def build_request(*)
164
168
  request = super
165
169
 
166
170
  return request if request.headers.key?("authorization")
@@ -97,6 +97,16 @@ module HTTPX
97
97
  end
98
98
  end
99
99
 
100
+ # adds support for the following options:
101
+ #
102
+ # :circuit_breaker_max_attempts :: the number of attempts the circuit allows, before it is opened (defaults to <tt>3</tt>).
103
+ # :circuit_breaker_reset_attempts_in :: the time a circuit stays open at most, before it resets (defaults to <tt>60</tt>).
104
+ # :circuit_breaker_break_on :: callable defining an alternative rule for a response to break
105
+ # (i.e. <tt>->(res) { res.status == 429 } </tt>)
106
+ # :circuit_breaker_break_in :: the time that must elapse before an open circuit can transit to the half-open state
107
+ # (defaults to <tt><60</tt>).
108
+ # :circuit_breaker_half_open_drip_rate :: the rate of requests a circuit allows to be performed when in an half-open state
109
+ # (defaults to <tt>1</tt>).
100
110
  module OptionsMethods
101
111
  def option_circuit_breaker_max_attempts(value)
102
112
  attempts = Integer(value)
@@ -40,6 +40,12 @@ module HTTPX
40
40
  end
41
41
  end
42
42
 
43
+ def build_request(*)
44
+ request = super
45
+ request.headers.set_cookie(request.options.cookies[request.uri])
46
+ request
47
+ end
48
+
43
49
  private
44
50
 
45
51
  def on_response(_request, response)
@@ -52,12 +58,6 @@ module HTTPX
52
58
 
53
59
  super
54
60
  end
55
-
56
- def build_request(*, _)
57
- request = super
58
- request.headers.set_cookie(request.options.cookies[request.uri])
59
- request
60
- end
61
61
  end
62
62
 
63
63
  module HeadersMethods
@@ -70,6 +70,9 @@ module HTTPX
70
70
  end
71
71
  end
72
72
 
73
+ # adds support for the following options:
74
+ #
75
+ # :cookies :: cookie jar for the session (can be a Hash, an Array, an instance of HTTPX::Plugins::Cookies::CookieJar)
73
76
  module OptionsMethods
74
77
  def option_headers(*)
75
78
  value = super
@@ -20,6 +20,9 @@ module HTTPX
20
20
  end
21
21
  end
22
22
 
23
+ # adds support for the following options:
24
+ #
25
+ # :digest :: instance of HTTPX::Plugins::Authentication::Digest, used to authenticate requests in the session.
23
26
  module OptionsMethods
24
27
  def option_digest(value)
25
28
  raise TypeError, ":digest must be a #{Authentication::Digest}" unless value.is_a?(Authentication::Digest)
@@ -20,6 +20,11 @@ module HTTPX
20
20
  end
21
21
  end
22
22
 
23
+ # adds support for the following options:
24
+ #
25
+ # :expect_timeout :: time (in seconds) to wait for a 100-expect response,
26
+ # before retrying without the Expect header (defaults to <tt>2</tt>).
27
+ # :expect_threshold_size :: min threshold (in bytes) of the request payload to enable the 100-continue negotiation on.
23
28
  module OptionsMethods
24
29
  def option_expect_timeout(value)
25
30
  seconds = Float(value)