Compare commits

..

No commits in common. "8652d1978ffc767e8f1960c247575c28d07590f8" and "3bcf5bd5f6bb0c971979338cde8c2fdcce434882" have entirely different histories.

12 changed files with 36 additions and 68 deletions

View File

@ -43,6 +43,16 @@ test jruby:
script:
./spec.sh jruby 9.0.0.0
allow_failure: true
test ruby 2/1:
<<: *test_settings
script:
./spec.sh ruby 2.1
test ruby 2/2:
<<: *test_settings
only:
- master
script:
./spec.sh ruby 2.2
test ruby 2/3:
<<: *test_settings
script:

View File

@ -1,6 +0,0 @@
# 0.22.5
## Bugfixes
* `datadog` and `sentry` integrations did not account for `Connection#send` being possibly called multiple times (something possible for connection coalescing, max requests exhaustion, or Happy Eyeballs 2), and were registering multiple `on(:response)` callbacks. Requests are now marked when decorated the first time.
* Happy Eyeballs handshake "connect errors" routine is now taking both name resolution errors, as well as TLS handshake errors, into account, when the handshake fails.

View File

@ -1,20 +0,0 @@
#
# From https://ipv6friday.org/blog/2012/11/happy-testing/
#
# The http server accessible via the test doamins is returning empty responses.
# If you want to verify that the correct IP family is being used to establish the connection,
# set HTTPX_DEBUG=2
#
require "httpx"
URLS = %w[http://badipv4.test.ipv6friday.org/] * 1
# URLS = %w[http://badipv6.test.ipv6friday.org/] * 1
responses = HTTPX.get(*URLS, ssl: { verify_mode: OpenSSL::SSL::VERIFY_NONE})
# responses = HTTPX.get(*URLS)
Array(responses).each(&:raise_for_status)
puts "Status: \n"
puts Array(responses).map(&:status)
puts "Payload: \n"
puts Array(responses).map(&:to_s)

View File

@ -198,14 +198,14 @@ class DatadogTest < Minitest::Test
assert span.get_tag("http.method") == verb
assert span.get_tag("http.url") == uri.path
error_tag = if defined?(::DDTrace) && Gem::Version.new(::DDTrace::VERSION::STRING) >= Gem::Version.new("1.8.0")
error_tag = if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.8.0"
"error.message"
else
"error.msg"
end
if error
assert span.get_tag("error.type") == "HTTPX::NativeResolveError"
assert span.get_tag("error.type") == error
assert !span.get_tag(error_tag).nil?
assert span.status == 1
elsif response.status >= 400
@ -241,7 +241,7 @@ class DatadogTest < Minitest::Test
assert span.get_metric("_dd1.sr.eausr") == sample_rate
end
if defined?(::DDTrace) && Gem::Version.new(::DDTrace::VERSION::STRING) >= Gem::Version.new("1.0.0")
if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.0.0"
def set_datadog(options = {}, &blk)
Datadog.configure do |c|
@ -305,7 +305,7 @@ class DatadogTest < Minitest::Test
# Retrieves and sorts all spans in the current tracer instance.
# This method does not cache its results.
def fetch_spans
spans = if defined?(::DDTrace) && Gem::Version.new(::DDTrace::VERSION::STRING) >= Gem::Version.new("1.0.0")
spans = if defined?(::DDTrace) && ::DDTrace::VERSION::STRING >= "1.0.0"
(tracer.instance_variable_get(:@traces) || []).map(&:spans)
else
tracer.instance_variable_get(:@spans) || []

View File

@ -158,19 +158,9 @@ module TRACING_MODULE # rubocop:disable Naming/ClassAndModuleCamelCase
end
end
module RequestMethods
def __datadog_enable_trace!
return super if @__datadog_enable_trace
RequestTracer.new(self).call
@__datadog_enable_trace = true
end
end
module ConnectionMethods
def send(request)
request.__datadog_enable_trace!
RequestTracer.new(request).call
super
end
end

View File

@ -89,19 +89,9 @@ module HTTPX::Plugins
end
end
module RequestMethods
def __sentry_enable_trace!
return super if @__sentry_enable_trace
Tracer.call(self)
@__sentry_enable_trace = true
end
end
module ConnectionMethods
def send(request)
request.__sentry_enable_trace!
Tracer.call(request)
super
end
end

View File

@ -22,12 +22,12 @@ module HTTPX
callbacks(type).delete_if { |pr| :delete == pr.call(*args) } # rubocop:disable Style/YodaCondition
end
def callbacks_for?(type)
@callbacks.key?(type) && @callbacks[type].any?
end
protected
def callbacks_for?(type)
@callbacks.key?(type) && !@callbacks[type].empty?
end
def callbacks(type = nil)
return @callbacks unless type

View File

@ -538,13 +538,12 @@ module HTTPX
# connect errors, exit gracefully
error = ConnectionError.new(e.message)
error.set_backtrace(e.backtrace)
connecting? && callbacks_for?(:connect_error) ? emit(:connect_error, error) : handle_error(error)
connecting? && callbacks(:connect_error).any? ? emit(:connect_error, error) : handle_error(error)
@state = :closed
emit(:close)
rescue TLSError => e
# connect errors, exit gracefully
handle_error(e)
connecting? && callbacks_for?(:connect_error) ? emit(:connect_error, e) : handle_error(e)
@state = :closed
emit(:close)
end

View File

@ -141,9 +141,8 @@ module HTTPX
connection.once(:connect_error) do |err|
if new_connection.connecting?
new_connection.merge(connection)
connection.force_reset
else
connection.__send__(:handle_error, err)
connection.handle_error(err)
end
end
@ -157,9 +156,8 @@ module HTTPX
if connection.connecting?
# main connection has the requests
connection.merge(new_connection)
new_connection.force_reset
else
new_connection.__send__(:handle_error, err)
new_connection.handle_error(err)
end
end
@ -185,8 +183,6 @@ module HTTPX
end
def on_resolver_error(connection, error)
return connection.emit(:connect_error, error) if connection.connecting? && connection.callbacks_for?(:connect_error)
connection.emit(:error, error)
end

View File

@ -64,7 +64,12 @@ module HTTPX
end
def on_resolver_error(connection, error)
emit(:error, connection, error)
@errors[connection] << error
return unless @errors[connection].size >= @resolvers.size
errors = @errors.delete(connection)
emit(:error, connection, errors.first)
end
def on_resolver_close(resolver)

View File

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

View File

@ -5,8 +5,6 @@ set -e
export LANG=C.UTF-8
export LANGUAGE=C.UTF-8
ruby --version
RUBY_PLATFORM=`ruby -e 'puts RUBY_PLATFORM'`
RUBY_ENGINE=`ruby -e 'puts RUBY_ENGINE'`
IPTABLES=iptables-translate
@ -15,6 +13,12 @@ if [[ "$RUBY_ENGINE" = "truffleruby" ]]; then
dnf install -y iptables iproute which file idn2 git xz
elif [[ "$RUBY_PLATFORM" = "java" ]]; then
apt-get update && apt-get install -y build-essential iptables iproute2 file idn2 git
elif [[ ${RUBY_VERSION:0:3} = "2.1" ]]; then
apt-get update && apt-get install -y --force-yes libsodium-dev iptables iproute2 libmagic-dev shared-mime-info
IPTABLES=iptables
elif [[ ${RUBY_VERSION:0:3} = "2.2" ]]; then
apt-get update && apt-get install -y --force-yes iptables iproute2 libmagic-dev shared-mime-info
IPTABLES=iptables
elif [[ ${RUBY_VERSION:0:3} = "2.3" ]]; then
# installing custom openssl
apt-get update && apt-get install -y iptables iproute2 iptables-nftables-compat libmagic-dev shared-mime-info # openssl=1.0.2l openssl-dev=1.0.2l