Compare commits

..

No commits in common. "2de2b026be61b82c7105cbbecdc573a9a9d34d94" and "834873638d01169c4987c0611cd978ed35683400" have entirely different histories.

9 changed files with 59 additions and 61 deletions

View File

@ -1,10 +0,0 @@
# 0.24.6
## dependencies
`http-2-next` last supported version for the 0.x series is the last version before v1. This shoul ensure that older versions of `httpx` won't be affected by any of the recent breaking changes.
## Bugfixes
* `grpc`: setup of rpc calls from camel-cased symbols has been fixed. As an improvement, the GRPC-enabled session will now support both snake-cased, as well as camel-cased calls.
* `datadog` adapter has now been patched to support the most recent breaking changes of `ddtrace` configuration DSL (`env_to_bool` is no longer supported).

View File

@ -1,7 +0,0 @@
# 1.0.2
## bugfixes
* bump `http-2-next` to 1.0.1, which fixes a bug where http/2 connection interprets MAX_CONCURRENT_STREAMS as request cap.
* `grpc`: setup of rpc calls from camel-cased symbols has been fixed. As an improvement, the GRPC-enabled session will now support both snake-cased, as well as camel-cased calls.
* `datadog` adapter has now been patched to support the most recent breaking changes of `ddtrace` configuration DSL (`env_to_bool` is no longer supported).

View File

@ -32,7 +32,7 @@ Gem::Specification.new do |gem|
gem.require_paths = ["lib"]
gem.add_runtime_dependency "http-2-next", ">= 1.0.1"
gem.add_runtime_dependency "http-2-next", ">= 1.0.0"
gem.required_ruby_version = ">= 2.7.0"
end

View File

@ -126,39 +126,22 @@ module Datadog::Tracing
option :distributed_tracing, default: true
option :split_by_domain, default: false
if DDTrace::VERSION::STRING >= "1.13.0"
option :enabled do |o|
o.type :bool
o.env "DD_TRACE_HTTPX_ENABLED"
o.default true
end
option :enabled do |o|
o.type :bool
o.env "DD_TRACE_HTTPX_ENABLED"
o.default true
end
option :analytics_enabled do |o|
o.type :bool
o.env "DD_TRACE_HTTPX_ANALYTICS_ENABLED"
o.default false
end
option :analytics_enabled do |o|
o.type :bool
o.env "DD_TRACE_HTTPX_ANALYTICS_ENABLED"
o.default false
end
option :analytics_sample_rate do |o|
o.type :float
o.env "DD_TRACE_HTTPX_ANALYTICS_SAMPLE_RATE"
o.default 1.0
end
else
option :enabled do |o|
o.default { env_to_bool("DD_TRACE_HTTPX_ENABLED", true) }
o.lazy
end
option :analytics_enabled do |o|
o.default { env_to_bool(%w[DD_TRACE_HTTPX_ANALYTICS_ENABLED DD_HTTPX_ANALYTICS_ENABLED], false) }
o.lazy
end
option :analytics_sample_rate do |o|
o.default { env_to_float(%w[DD_TRACE_HTTPX_ANALYTICS_SAMPLE_RATE DD_HTTPX_ANALYTICS_SAMPLE_RATE], 1.0) }
o.lazy
end
option :analytics_sample_rate do |o|
o.type :float
o.env "DD_TRACE_HTTPX_ANALYTICS_SAMPLE_RATE"
o.default 1.0
end
if defined?(Datadog::Tracing::Contrib::SpanAttributeSchema)
@ -187,13 +170,11 @@ module Datadog::Tracing
o.type :proc
o.default_proc(&DEFAULT_ERROR_HANDLER)
end
elsif DDTrace::VERSION::STRING >= "1.13.0"
else
option :error_handler do |o|
o.type :proc
o.experimental_default_proc(&DEFAULT_ERROR_HANDLER)
end
else
option :error_handler, default: DEFAULT_ERROR_HANDLER
end
end
end
@ -224,7 +205,7 @@ module Datadog::Tracing
class Integration
include Contrib::Integration
MINIMUM_VERSION = Gem::Version.new("0.10.2")
MINIMUM_VERSION = Gem::Version.new("1.0.1")
register_as :httpx

View File

@ -7,7 +7,7 @@ module HTTPX
include Callbacks
include Loggable
MAX_REQUESTS = 200
MAX_REQUESTS = 100
CRLF = "\r\n"
attr_reader :pending, :requests

View File

@ -35,7 +35,7 @@ module HTTPX
@handshake_completed = false
@wait_for_handshake = @settings.key?(:wait_for_handshake) ? @settings.delete(:wait_for_handshake) : true
@max_concurrent_requests = @options.max_concurrent_requests || MAX_CONCURRENT_REQUESTS
@max_requests = @options.max_requests || Float::INFINITY
@max_requests = @options.max_requests || 0
init_connection
end
@ -82,7 +82,9 @@ module HTTPX
end
def exhausted?
!@max_requests.positive?
return false if @max_requests.zero? && @connection.active_stream_count.zero?
@connection.active_stream_count >= @max_requests
end
def <<(data)
@ -90,9 +92,13 @@ module HTTPX
end
def can_buffer_more_requests?
(@handshake_completed || !@wait_for_handshake) &&
if @handshake_completed
@streams.size < @max_concurrent_requests &&
@streams.size < @max_requests
@streams.size < @max_requests
else
!@wait_for_handshake &&
@streams.size < @max_concurrent_requests
end
end
def send(request)
@ -110,6 +116,7 @@ module HTTPX
true
rescue HTTP2Next::Error::StreamLimitExceeded
@pending.unshift(request)
emit(:exhausted)
end
def consume
@ -165,6 +172,7 @@ module HTTPX
def init_connection
@connection = HTTP2Next::Client.new(@settings)
@connection.max_streams = @max_requests if @connection.respond_to?(:max_streams=) && @max_requests.positive?
@connection.on(:frame, &method(:on_frame))
@connection.on(:frame_sent, &method(:on_frame_sent))
@connection.on(:frame_received, &method(:on_frame_received))
@ -332,7 +340,14 @@ module HTTPX
def on_settings(*)
@handshake_completed = true
emit(:current_timeout)
@max_concurrent_requests = [@max_concurrent_requests, @connection.remote_settings[:settings_max_concurrent_streams]].min
if @max_requests.zero?
@max_requests = @connection.remote_settings[:settings_max_concurrent_streams]
@connection.max_streams = @max_requests if @connection.respond_to?(:max_streams=) && @max_requests.positive?
end
@max_concurrent_requests = [@max_concurrent_requests, @max_requests].min
send_pending
end

View File

@ -1,5 +1,5 @@
# frozen_string_literal: true
module HTTPX
VERSION = "1.0.2"
VERSION = "1.0.1"
end

View File

@ -114,7 +114,7 @@ class HTTPSTest < Minitest::Test
def test_http2_max_streams
uri = build_uri("/get")
HTTPX.plugin(SessionWithPool).with(max_requests: 1).wrap do |http|
HTTPX.plugin(SessionWithSingleStream).plugin(SessionWithPool).wrap do |http|
http.get(uri, uri)
connection_count = http.pool.connection_count
assert connection_count == 2, "expected to have 2 connections, instead have #{connection_count}"

View File

@ -0,0 +1,19 @@
# frozen_string_literal: true
#
# This module is used only to test transitions from a full HTTP/2 connection when it
# exhausts the number of streamss
#
module SessionWithSingleStream
module ConnectionMethods
def build_parser
parser = super
def parser.exhausted?
@connection.active_stream_count.positive?
end
parser.instance_variable_set(:@max_requests, 10)
parser.instance_variable_get(:@connection).max_streams = 1
parser
end
end
end