diff --git a/lib/http/timeout/null.rb b/lib/http/timeout/null.rb index 535e53de..524a04a5 100644 --- a/lib/http/timeout/null.rb +++ b/lib/http/timeout/null.rb @@ -185,12 +185,14 @@ def rescue_writable(timeout = write_timeout) # @return [Object] the connected socket # @api private def open_socket(socket_class, host, port, connect_timeout: nil) - if connect_timeout + return socket_class.open(host, port) unless connect_timeout + + if native_timeout?(socket_class) + open_with_timeout(socket_class, host, port, connect_timeout) + else ::Timeout.timeout(connect_timeout, ConnectTimeoutError) do open_with_timeout(socket_class, host, port, connect_timeout) end - else - socket_class.open(host, port) end rescue IO::TimeoutError raise ConnectTimeoutError, "Connect timed out after #{connect_timeout} seconds" diff --git a/test/http/client_test.rb b/test/http/client_test.rb index 1358de0e..8e8d4d36 100644 --- a/test/http/client_test.rb +++ b/test/http/client_test.rb @@ -402,7 +402,7 @@ def test_feature_is_given_a_chance_to_handle_a_connection_timeout_error sleep_url = "#{dummy.endpoint}/sleep" feature_instance = feature_class.new - TCPSocket.stub(:open, ->(*) { sleep 0.1 }) do + TCPSocket.stub(:open, ->(*, **) { raise IO::TimeoutError }) do assert_raises(HTTP::ConnectTimeoutError) do client.use(test_feature: feature_instance) .timeout(0.001) diff --git a/test/support/http_handling_shared/timeout_tests.rb b/test/support/http_handling_shared/timeout_tests.rb index ca8fb432..15cf7f22 100644 --- a/test/support/http_handling_shared/timeout_tests.rb +++ b/test/support/http_handling_shared/timeout_tests.rb @@ -72,9 +72,9 @@ def test_timeout_global_errors_if_connecting_takes_too_long timeout_options: { global_timeout: 0.01 } ) - TCPSocket.stub(:open, ->(*) { sleep 0.025 }) do + TCPSocket.stub(:open, ->(*, **) { raise IO::TimeoutError }) do err = assert_raises(HTTP::ConnectTimeoutError) { client.get(server.endpoint).body.to_s } - assert_match(/execution/, err.message) + assert_match(/Connect timed out|execution/, err.message) end end