httpx 1.2.6 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)