httpx 1.2.2 → 1.2.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7aff2acc77577cb1243c30a63766f404755131c2f1b19162b9b6ba13c49d61f8
4
- data.tar.gz: 6297b0857edce0f5d93a0272c2b5e891257969c36cbf0c34c6a7ca6e4a5ced67
3
+ metadata.gz: 7d5abc65b9f6377dbcefbe9170c7c47ef3555b4286c2d9c5e6e521467a75d57e
4
+ data.tar.gz: 7dfac2d6aa4ed5ecba31479ec0750de9d310657c39e12efd57f62d1544d9d1b7
5
5
  SHA512:
6
- metadata.gz: 94da91dd14a8318e8f0a0199214f97c008b927c7b8d9f602f045434bbd375b4446c767ed805e424d826c3dc48e90a8a0fded192858d32763c4c38033e0107cae
7
- data.tar.gz: 657cefe9a977ca56dddda02bbdb07a94b4a8f158193e5f0d695c254bdbcafd95ffccd29641d38958d16468a81fd236f4d95ef4487c335cf7e079fb29b8d456ba
6
+ metadata.gz: 720fe0c6f0883d0755122ae8009da116f7b06b0f009b56480cf3f1f80ef998e4671d6f53ce039e6d52f502c596e22fa524d6292a3372c8bd3a7f88616f6aaffc
7
+ data.tar.gz: 75fdb8eee5568a3be2fdd19a4750b18166d2eb25749a0a1cde672b0deab76d1e64c8d573665488b7d2db99d4de73f387583a75ad5a957be9529dfef4b36f11ac
@@ -0,0 +1,16 @@
1
+ # 1.2.3
2
+
3
+ ## Improvements
4
+
5
+ * `:retries` plugin: allow `:max_retries` set to 0 (allows for a soft disable of retries when using the faraday adapter).
6
+
7
+ ## Bugfixes
8
+
9
+ * `:oauth` plugin: fix for default auth method being ignored when setting grant type and scope as options only.
10
+ * ensure happy eyeballs-initiated cloned connections also set session callbacks (caused issues when server would respond with a 421 response, an event requiring a valid internal callback).
11
+ * native resolver cleanly transitions from tcp to udp after truncated DNS query (causing issues on follow-up CNAME resolution).
12
+ * elapsing timeouts now guard against mutation of callbacks while looping (prevents skipping callbacks in situations where a previous one would remove itself from the collection).
13
+
14
+ ## Chore
15
+
16
+ * datadog adapter: do not call `.lazy` on options (avoids deprecation warning, to be removed in ddtrace 2.0)
@@ -0,0 +1,8 @@
1
+ # 1.2.4
2
+
3
+ ## Bugfixes
4
+
5
+ * fixed issue related to inability to buffer payload to error responses (which may happen on certain error handling situations).
6
+ * fixed recovery from a lost persistent connection leaving process due to ping being sent while still marked as inactive.
7
+ * fixed datadog integration, which was not generating new spans on retried requests (when `:retries` plugin is enabled).
8
+ * fixed splitting strings into key value pairs in cases where the value would contain a "=", such as in certain base64 payloads.
@@ -7,6 +7,8 @@ require "datadog/tracing/contrib/patcher"
7
7
  module Datadog::Tracing
8
8
  module Contrib
9
9
  module HTTPX
10
+ DATADOG_VERSION = defined?(::DDTrace) ? ::DDTrace::VERSION : ::Datadog::VERSION
11
+
10
12
  METADATA_MODULE = Datadog::Tracing::Metadata
11
13
 
12
14
  TYPE_OUTBOUND = Datadog::Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
@@ -22,9 +24,10 @@ module Datadog::Tracing
22
24
 
23
25
  # HTTPX Datadog Plugin
24
26
  #
25
- # Enables tracing for httpx requests. A span will be created for each individual requests,
26
- # and it'll trace since the moment it is fed to the connection, until the moment the response is
27
- # fed back to the session.
27
+ # Enables tracing for httpx requests.
28
+ #
29
+ # A span will be created for each request transaction; the span is created lazily only when
30
+ # receiving a response, and it is fed the start time stored inside the tracer object.
28
31
  #
29
32
  module Plugin
30
33
  class RequestTracer
@@ -32,82 +35,174 @@ module Datadog::Tracing
32
35
 
33
36
  SPAN_REQUEST = "httpx.request"
34
37
 
38
+ # initializes the tracer object on the +request+.
35
39
  def initialize(request)
36
40
  @request = request
41
+ @start_time = nil
42
+
43
+ # request objects are reused, when already buffered requests get rerouted to a different
44
+ # connection due to connection issues, or when they already got a response, but need to
45
+ # be retried. In such situations, the original span needs to be extended for the former,
46
+ # while a new is required for the latter.
47
+ request.on(:idle) { reset }
48
+ # the span is initialized when the request is buffered in the parser, which is the closest
49
+ # one gets to actually sending the request.
50
+ request.on(:headers) { call }
37
51
  end
38
52
 
39
- def call
40
- return unless Datadog::Tracing.enabled?
53
+ # sets up the span start time, while preparing the on response callback.
54
+ def call(*args)
55
+ return if @start_time
56
+
57
+ start(*args)
58
+
59
+ @request.once(:response, &method(:finish))
60
+ end
61
+
62
+ private
63
+
64
+ # just sets the span init time. It can be passed a +start_time+ in cases where
65
+ # this is collected outside the request transaction.
66
+ def start(start_time = now)
67
+ @start_time = start_time
68
+ end
69
+
70
+ # resets the start time for already finished request transactions.
71
+ def reset
72
+ return unless @start_time
41
73
 
42
- @request.on(:response, &method(:finish))
74
+ start
75
+ end
76
+
77
+ # creates the span from the collected +@start_time+ to what the +response+ state
78
+ # contains. It also resets internal state to allow this object to be reused.
79
+ def finish(response)
80
+ return unless @start_time
43
81
 
82
+ span = initialize_span
83
+
84
+ return unless span
85
+
86
+ if response.is_a?(::HTTPX::ErrorResponse)
87
+ span.set_error(response.error)
88
+ else
89
+ span.set_tag(TAG_STATUS_CODE, response.status.to_s)
90
+
91
+ span.set_error(::HTTPX::HTTPError.new(response)) if response.status >= 400 && response.status <= 599
92
+ end
93
+
94
+ span.finish
95
+ ensure
96
+ @start_time = nil
97
+ end
98
+
99
+ # return a span initialized with the +@request+ state.
100
+ def initialize_span
44
101
  verb = @request.verb
45
102
  uri = @request.uri
46
103
 
47
- @span = Datadog::Tracing.trace(
48
- SPAN_REQUEST,
49
- service: service_name(@request.uri.host, configuration, Datadog.configuration_for(self)),
50
- span_type: TYPE_OUTBOUND
51
- )
104
+ span = create_span(@request)
52
105
 
53
- @span.resource = verb
106
+ span.resource = verb
54
107
 
55
108
  # Add additional request specific tags to the span.
56
109
 
57
- @span.set_tag(TAG_URL, @request.path)
58
- @span.set_tag(TAG_METHOD, verb)
110
+ span.set_tag(TAG_URL, @request.path)
111
+ span.set_tag(TAG_METHOD, verb)
59
112
 
60
- @span.set_tag(TAG_TARGET_HOST, uri.host)
61
- @span.set_tag(TAG_TARGET_PORT, uri.port.to_s)
113
+ span.set_tag(TAG_TARGET_HOST, uri.host)
114
+ span.set_tag(TAG_TARGET_PORT, uri.port.to_s)
62
115
 
63
116
  # Tag as an external peer service
64
- @span.set_tag(TAG_PEER_SERVICE, @span.service)
117
+ span.set_tag(TAG_PEER_SERVICE, span.service)
65
118
 
66
- Datadog::Tracing::Propagation::HTTP.inject!(Datadog::Tracing.active_trace,
67
- @request.headers) if @configuration[:distributed_tracing]
119
+ if configuration[:distributed_tracing]
120
+ propagate_trace_http(
121
+ Datadog::Tracing.active_trace.to_digest,
122
+ @request.headers
123
+ )
124
+ end
68
125
 
69
126
  # Set analytics sample rate
70
- if Contrib::Analytics.enabled?(@configuration[:analytics_enabled])
71
- Contrib::Analytics.set_sample_rate(@span, @configuration[:analytics_sample_rate])
127
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
128
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
72
129
  end
130
+
131
+ span
73
132
  rescue StandardError => e
74
133
  Datadog.logger.error("error preparing span for http request: #{e}")
75
134
  Datadog.logger.error(e.backtrace)
76
135
  end
77
136
 
78
- def finish(response)
79
- return unless @span
137
+ def now
138
+ ::Datadog::Core::Utils::Time.now.utc
139
+ end
80
140
 
81
- if response.is_a?(::HTTPX::ErrorResponse)
82
- @span.set_error(response.error)
83
- else
84
- @span.set_tag(TAG_STATUS_CODE, response.status.to_s)
141
+ def configuration
142
+ @configuration ||= Datadog.configuration.tracing[:httpx, @request.uri.host]
143
+ end
85
144
 
86
- @span.set_error(::HTTPX::HTTPError.new(response)) if response.status >= 400 && response.status <= 599
145
+ if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("2.0.0.beta1")
146
+ def propagate_trace_http(digest, headers)
147
+ Datadog::Tracing::Contrib::HTTP.inject(digest, headers)
87
148
  end
88
149
 
89
- @span.finish
90
- end
91
-
92
- private
150
+ def create_span(request)
151
+ Datadog::Tracing.trace(
152
+ SPAN_REQUEST,
153
+ service: service_name(request.uri.host, configuration, Datadog.configuration_for(self)),
154
+ type: TYPE_OUTBOUND,
155
+ start_time: @start_time
156
+ )
157
+ end
158
+ else
159
+ def propagate_trace_http(digest, headers)
160
+ Datadog::Tracing::Propagation::HTTP.inject!(digest, headers)
161
+ end
93
162
 
94
- def configuration
95
- @configuration ||= Datadog.configuration.tracing[:httpx, @request.uri.host]
163
+ def create_span(request)
164
+ Datadog::Tracing.trace(
165
+ SPAN_REQUEST,
166
+ service: service_name(request.uri.host, configuration, Datadog.configuration_for(self)),
167
+ span_type: TYPE_OUTBOUND,
168
+ start_time: @start_time
169
+ )
170
+ end
96
171
  end
97
172
  end
98
173
 
99
174
  module RequestMethods
100
- def __datadog_enable_trace!
101
- return if @__datadog_enable_trace
175
+ # intercepts request initialization to inject the tracing logic.
176
+ def initialize(*)
177
+ super
178
+
179
+ return unless Datadog::Tracing.enabled?
102
180
 
103
- RequestTracer.new(self).call
104
- @__datadog_enable_trace = true
181
+ RequestTracer.new(self)
105
182
  end
106
183
  end
107
184
 
108
185
  module ConnectionMethods
109
- def send(request)
110
- request.__datadog_enable_trace!
186
+ attr_reader :init_time
187
+
188
+ def initialize(*)
189
+ super
190
+
191
+ @init_time = ::Datadog::Core::Utils::Time.now.utc
192
+ end
193
+
194
+ # handles the case when the +error+ happened during name resolution, which meanns
195
+ # that the tracing logic hasn't been injected yet; in such cases, the approximate
196
+ # initial resolving time is collected from the connection, and used as span start time,
197
+ # and the tracing object in inserted before the on response callback is called.
198
+ def handle_error(error)
199
+ return super unless Datadog::Tracing.enabled?
200
+
201
+ return super unless error.respond_to?(:connection)
202
+
203
+ @pending.each do |request|
204
+ RequestTracer.new(request).call(error.connection.init_time)
205
+ end
111
206
 
112
207
  super
113
208
  end
@@ -126,7 +221,7 @@ module Datadog::Tracing
126
221
  option :distributed_tracing, default: true
127
222
  option :split_by_domain, default: false
128
223
 
129
- if Gem::Version.new(DDTrace::VERSION::STRING) >= Gem::Version.new("1.13.0")
224
+ if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.13.0")
130
225
  option :enabled do |o|
131
226
  o.type :bool
132
227
  o.env "DD_TRACE_HTTPX_ENABLED"
@@ -169,25 +264,25 @@ module Datadog::Tracing
169
264
  "httpx"
170
265
  )
171
266
  end
172
- o.lazy
267
+ o.lazy unless Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.13.0")
173
268
  end
174
269
  else
175
270
  option :service_name do |o|
176
271
  o.default do
177
272
  ENV.fetch("DD_TRACE_HTTPX_SERVICE_NAME", "httpx")
178
273
  end
179
- o.lazy
274
+ o.lazy unless Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.13.0")
180
275
  end
181
276
  end
182
277
 
183
278
  option :distributed_tracing, default: true
184
279
 
185
- if Gem::Version.new(DDTrace::VERSION::STRING) >= Gem::Version.new("1.15.0")
280
+ if Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.15.0")
186
281
  option :error_handler do |o|
187
282
  o.type :proc
188
283
  o.default_proc(&DEFAULT_ERROR_HANDLER)
189
284
  end
190
- elsif Gem::Version.new(DDTrace::VERSION::STRING) >= Gem::Version.new("1.13.0")
285
+ elsif Gem::Version.new(DATADOG_VERSION::STRING) >= Gem::Version.new("1.13.0")
191
286
  option :error_handler do |o|
192
287
  o.type :proc
193
288
  o.experimental_default_proc(&DEFAULT_ERROR_HANDLER)
data/lib/httpx/altsvc.rb CHANGED
@@ -131,9 +131,9 @@ module HTTPX
131
131
  scanner.skip(/;/)
132
132
  break if scanner.eos? || scanner.scan(/ *, */)
133
133
  end
134
- alt_params = Hash[alt_params.map { |field| field.split("=") }]
134
+ alt_params = Hash[alt_params.map { |field| field.split("=", 2) }]
135
135
 
136
- alt_proto, alt_authority = alt_service.split("=")
136
+ alt_proto, alt_authority = alt_service.split("=", 2)
137
137
  alt_origin = parse_altsvc_origin(alt_proto, alt_authority)
138
138
  return unless alt_origin
139
139
 
@@ -245,7 +245,7 @@ module HTTPX
245
245
  return unless keep_alive
246
246
 
247
247
  parameters = Hash[keep_alive.split(/ *, */).map do |pair|
248
- pair.split(/ *= */)
248
+ pair.split(/ *= */, 2)
249
249
  end]
250
250
  @max_requests = parameters["max"].to_i - 1 if parameters.key?("max")
251
251
 
@@ -241,8 +241,8 @@ module HTTPX
241
241
  # for such cases, we want to ping for availability before deciding to shovel requests.
242
242
  log(level: 3) { "keep alive timeout expired, pinging connection..." }
243
243
  @pending << request
244
- parser.ping
245
244
  transition(:active) if @state == :inactive
245
+ parser.ping
246
246
  return
247
247
  end
248
248
 
@@ -30,7 +30,8 @@ module HTTPX
30
30
  auth_info = authenticate[/^(\w+) (.*)/, 2]
31
31
 
32
32
  params = auth_info.split(/ *, */)
33
- .to_h { |val| val.split("=") }.transform_values { |v| v.delete("\"") }
33
+ .to_h { |val| val.split("=", 2) }
34
+ .transform_values { |v| v.delete("\"") }
34
35
  nonce = params["nonce"]
35
36
  nc = next_nonce
36
37
 
@@ -197,8 +197,8 @@ module HTTPX
197
197
  params.each.with_index.sort do |a, b|
198
198
  a, a_offset = a
199
199
  b, b_offset = b
200
- a_name, a_value = a.split("=")
201
- b_name, b_value = b.split("=")
200
+ a_name, a_value = a.split("=", 2)
201
+ b_name, b_value = b.split("=", 2)
202
202
  if a_name == b_name
203
203
  if a_value == b_value
204
204
  a_offset <=> b_offset
@@ -16,7 +16,7 @@ module HTTPX
16
16
  SUPPORTED_AUTH_METHODS = %w[client_secret_basic client_secret_post].freeze
17
17
 
18
18
  class OAuthSession
19
- attr_reader :token_endpoint_auth_method, :grant_type, :client_id, :client_secret, :access_token, :refresh_token, :scope
19
+ attr_reader :grant_type, :client_id, :client_secret, :access_token, :refresh_token, :scope
20
20
 
21
21
  def initialize(
22
22
  issuer:,
@@ -28,7 +28,7 @@ module HTTPX
28
28
  token_endpoint: nil,
29
29
  response_type: nil,
30
30
  grant_type: nil,
31
- token_endpoint_auth_method: "client_secret_basic"
31
+ token_endpoint_auth_method: nil
32
32
  )
33
33
  @issuer = URI(issuer)
34
34
  @client_id = client_id
@@ -43,10 +43,10 @@ module HTTPX
43
43
  end
44
44
  @access_token = access_token
45
45
  @refresh_token = refresh_token
46
- @token_endpoint_auth_method = String(token_endpoint_auth_method)
46
+ @token_endpoint_auth_method = String(token_endpoint_auth_method) if token_endpoint_auth_method
47
47
  @grant_type = grant_type || (@refresh_token ? "refresh_token" : "client_credentials")
48
48
 
49
- unless SUPPORTED_AUTH_METHODS.include?(@token_endpoint_auth_method)
49
+ unless @token_endpoint_auth_method.nil? || SUPPORTED_AUTH_METHODS.include?(@token_endpoint_auth_method)
50
50
  raise Error, "#{@token_endpoint_auth_method} is not a supported auth method"
51
51
  end
52
52
 
@@ -59,8 +59,12 @@ module HTTPX
59
59
  @token_endpoint || "#{@issuer}/token"
60
60
  end
61
61
 
62
+ def token_endpoint_auth_method
63
+ @token_endpoint_auth_method || "client_secret_basic"
64
+ end
65
+
62
66
  def load(http)
63
- return if @token_endpoint_auth_method && @grant_type && @scope
67
+ return if @grant_type && @scope
64
68
 
65
69
  metadata = http.get("#{@issuer}/.well-known/oauth-authorization-server").raise_for_status.json
66
70
 
@@ -123,11 +127,11 @@ module HTTPX
123
127
 
124
128
  # auth
125
129
  case oauth_session.token_endpoint_auth_method
126
- when "client_secret_basic"
127
- headers["authorization"] = Authentication::Basic.new(oauth_session.client_id, oauth_session.client_secret).authenticate
128
130
  when "client_secret_post"
129
131
  form_post["client_id"] = oauth_session.client_id
130
132
  form_post["client_secret"] = oauth_session.client_secret
133
+ when "client_secret_basic"
134
+ headers["authorization"] = Authentication::Basic.new(oauth_session.client_id, oauth_session.client_secret).authenticate
131
135
  end
132
136
 
133
137
  case grant_type
@@ -58,7 +58,7 @@ module HTTPX
58
58
 
59
59
  def option_max_retries(value)
60
60
  num = Integer(value)
61
- raise TypeError, ":max_retries must be positive" unless num.positive?
61
+ raise TypeError, ":max_retries must be positive" unless num >= 0
62
62
 
63
63
  num
64
64
  end
data/lib/httpx/pool.rb CHANGED
@@ -179,6 +179,7 @@ module HTTPX
179
179
  connection.once(:connect_error) do |err|
180
180
  if new_connection.connecting?
181
181
  new_connection.merge(connection)
182
+ connection.emit(:cloned, new_connection)
182
183
  connection.force_reset
183
184
  else
184
185
  connection.__send__(:handle_error, err)
@@ -195,6 +196,7 @@ module HTTPX
195
196
  if connection.connecting?
196
197
  # main connection has the requests
197
198
  connection.merge(new_connection)
199
+ new_connection.emit(:cloned, connection)
198
200
  new_connection.force_reset
199
201
  else
200
202
  new_connection.__send__(:handle_error, err)
@@ -187,10 +187,10 @@ module HTTPX
187
187
  next unless @large_packet.full?
188
188
 
189
189
  parse(@large_packet.to_s)
190
-
191
190
  @socket_type = @resolver_options.fetch(:socket_type, :udp)
192
191
  @large_packet = nil
193
- transition(:closed)
192
+ transition(:idle)
193
+ transition(:open)
194
194
  return
195
195
  else
196
196
  size = @read_buffer[0, 2].unpack1("n")
@@ -7,10 +7,18 @@ require "fileutils"
7
7
  require "forwardable"
8
8
 
9
9
  module HTTPX
10
- # Defines a HTTP response is handled internally, with a few properties exposed as attributes,
11
- # implements (indirectly, via the +body+) the IO write protocol to internally buffer payloads,
12
- # implements the IO reader protocol in order for users to buffer/stream it, acts as an enumerable
10
+ # Defines a HTTP response is handled internally, with a few properties exposed as attributes.
11
+ #
12
+ # It delegates the following methods to the corresponding HTTPX::Request:
13
+ #
14
+ # * HTTPX::Request#uri
15
+ # * HTTPX::Request#peer_address
16
+ #
17
+ # It implements (indirectly, via the +body+) the IO write protocol to internally buffer payloads.
18
+ #
19
+ # It implements the IO reader protocol in order for users to buffer/stream it, acts as an enumerable
13
20
  # (of payload chunks).
21
+ #
14
22
  class Response
15
23
  extend Forwardable
16
24
  include Callbacks
@@ -21,7 +29,13 @@ module HTTPX
21
29
  # an HTTPX::Headers object containing the response HTTP headers.
22
30
  attr_reader :headers
23
31
 
24
- # a HTTPX::Response::Body object wrapping the response body.
32
+ # a HTTPX::Response::Body object wrapping the response body. The following methods are delegated to it:
33
+ #
34
+ # * HTTPX::Response::Body#to_s
35
+ # * HTTPX::Response::Body#to_str
36
+ # * HTTPX::Response::Body#read
37
+ # * HTTPX::Response::Body#copy_to
38
+ # * HTTPX::Response::Body#close
25
39
  attr_reader :body
26
40
 
27
41
  # The HTTP protocol version used to fetch the response.
@@ -260,6 +274,11 @@ module HTTPX
260
274
  def raise_for_status
261
275
  raise @error
262
276
  end
277
+
278
+ # buffers lost chunks to error response
279
+ def <<(data)
280
+ @response << data
281
+ end
263
282
  end
264
283
  end
265
284
 
data/lib/httpx/session.rb CHANGED
@@ -138,7 +138,7 @@ module HTTPX
138
138
 
139
139
  # sets the callbacks on the +connection+ required to process certain specific
140
140
  # connection lifecycle events which deal with request rerouting.
141
- def set_connection_callbacks(connection, connections, options)
141
+ def set_connection_callbacks(connection, connections, options, cloned: false)
142
142
  connection.only(:misdirected) do |misdirected_request|
143
143
  other_connection = connection.create_idle(ssl: { alpn_protocols: %w[http/1.1] })
144
144
  other_connection.merge(connection)
@@ -154,6 +154,10 @@ module HTTPX
154
154
  other_connection = build_altsvc_connection(connection, connections, alt_origin, origin, alt_params, options)
155
155
  connections << other_connection if other_connection
156
156
  end
157
+ connection.only(:cloned) do |cloned_conn|
158
+ set_connection_callbacks(cloned_conn, connections, options, cloned: true)
159
+ connections << cloned_conn
160
+ end unless cloned
157
161
  end
158
162
 
159
163
  # returns an HTTPX::Connection for the negotiated Alternative Service (or none).
data/lib/httpx/timers.rb CHANGED
@@ -97,7 +97,10 @@ module HTTPX
97
97
  def elapse(elapsed)
98
98
  @interval -= elapsed
99
99
 
100
- @callbacks.each(&:call) if @interval <= 0
100
+ if @interval <= 0
101
+ cb = @callbacks.dup
102
+ cb.each(&:call)
103
+ end
101
104
 
102
105
  @interval
103
106
  end
data/lib/httpx/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTPX
4
- VERSION = "1.2.2"
4
+ VERSION = "1.2.4"
5
5
  end
@@ -15,8 +15,6 @@ module HTTPX
15
15
  SUPPORTED_AUTH_METHODS: ::Array[token_auth_method]
16
16
 
17
17
  class OAuthSession
18
- attr_reader token_endpoint_auth_method: token_auth_method
19
-
20
18
  attr_reader grant_type: grant_type
21
19
 
22
20
  attr_reader client_id: String
@@ -33,6 +31,8 @@ module HTTPX
33
31
 
34
32
  def token_endpoint: () -> String
35
33
 
34
+ def token_endpoint_auth_method: () -> token_auth_method
35
+
36
36
  def load: (Session http) -> void
37
37
 
38
38
  def merge: (instance | Hash[untyped, untyped] other) -> instance
data/sig/response.rbs CHANGED
@@ -70,6 +70,7 @@ module HTTPX
70
70
 
71
71
  class ErrorResponse
72
72
  include _Response
73
+ include _Reader
73
74
  include Loggable
74
75
  extend Forwardable
75
76
 
data/sig/session.rbs CHANGED
@@ -31,7 +31,7 @@ module HTTPX
31
31
 
32
32
  def send_request: (Request request, Array[Connection] connections, ?Options options) -> void
33
33
 
34
- def set_connection_callbacks: (Connection connection, Array[Connection] connections, Options options) -> void
34
+ def set_connection_callbacks: (Connection connection, Array[Connection] connections, Options options, ?cloned: bool) -> void
35
35
 
36
36
  def set_request_callbacks: (Request request) -> void
37
37
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-02 00:00:00.000000000 Z
11
+ date: 2024-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-2-next
@@ -140,6 +140,8 @@ extra_rdoc_files:
140
140
  - doc/release_notes/1_2_0.md
141
141
  - doc/release_notes/1_2_1.md
142
142
  - doc/release_notes/1_2_2.md
143
+ - doc/release_notes/1_2_3.md
144
+ - doc/release_notes/1_2_4.md
143
145
  files:
144
146
  - LICENSE.txt
145
147
  - README.md
@@ -251,6 +253,8 @@ files:
251
253
  - doc/release_notes/1_2_0.md
252
254
  - doc/release_notes/1_2_1.md
253
255
  - doc/release_notes/1_2_2.md
256
+ - doc/release_notes/1_2_3.md
257
+ - doc/release_notes/1_2_4.md
254
258
  - lib/httpx.rb
255
259
  - lib/httpx/adapters/datadog.rb
256
260
  - lib/httpx/adapters/faraday.rb