From bb16658221191e94ea83a3c3503c4573660c9a87 Mon Sep 17 00:00:00 2001 From: Daniel Pepper Date: Tue, 6 Dec 2022 11:57:40 -0800 Subject: [PATCH 1/2] test adapter timeout --- lib/faraday/adapter.rb | 3 +-- lib/faraday/adapter/test.rb | 20 +++++++++++++++++--- spec/faraday/adapter/test_spec.rb | 29 +++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/lib/faraday/adapter.rb b/lib/faraday/adapter.rb index f3e6af7bf..a581166c6 100644 --- a/lib/faraday/adapter.rb +++ b/lib/faraday/adapter.rb @@ -78,8 +78,7 @@ def save_response(env, status, body, headers = nil, reason_phrase = nil, finishe # @param type [Symbol] Describes which timeout setting to get: :read, # :write, or :open. # @param options [Hash] Hash containing Symbol keys like :timeout, - # :read_timeout, :write_timeout, :open_timeout, or - # :timeout + # :read_timeout, :write_timeout, or :open_timeout # # @return [Integer, nil] Timeout duration in seconds, or nil if no timeout # has been set. diff --git a/lib/faraday/adapter/test.rb b/lib/faraday/adapter/test.rb index b8a5b28aa..2765d51d7 100644 --- a/lib/faraday/adapter/test.rb +++ b/lib/faraday/adapter/test.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'timeout' + module Faraday class Adapter # @example @@ -277,13 +279,25 @@ def call(env) end block_arity = stub.block.arity + params = if block_arity >= 0 + [env, meta].take(block_arity) + else + [env, meta] + end + + timeout = request_timeout(:open, env[:request]) + timeout ||= request_timeout(:read, env[:request]) + status, headers, body = - if block_arity >= 0 - stub.block.call(*[env, meta].take(block_arity)) + if timeout + ::Timeout.timeout(timeout, Faraday::TimeoutError) do + stub.block.call(*params) + end else - stub.block.call(env, meta) + stub.block.call(*params) end + # We need to explicitly pass `reason_phrase = nil` here to avoid keyword args conflicts. # See https://github.com/lostisland/faraday/issues/1444 # TODO: remove `nil` explicit reason_phrase once Ruby 3.0 becomes minimum req. version diff --git a/spec/faraday/adapter/test_spec.rb b/spec/faraday/adapter/test_spec.rb index bdeb6cdf9..117bb7899 100644 --- a/spec/faraday/adapter/test_spec.rb +++ b/spec/faraday/adapter/test_spec.rb @@ -410,4 +410,33 @@ def make_request end end end + + describe 'request timeout' do + subject(:request) do + connection.get('/sleep') do |req| + req.options.timeout = timeout + end + end + + before do + stubs.get('/sleep') do + sleep(0.01) + [200, {}, ''] + end + end + + context 'when request is within timeout' do + let(:timeout) { 1 } + + it { expect(request.status).to eq 200 } + end + + context 'when request is too slow' do + let(:timeout) { 0.001 } + + it 'raises an exception' do + expect { request }.to raise_error(Faraday::TimeoutError) + end + end + end end From 0fe2519c69090699e629b5dfbd8dc7d14aa898aa Mon Sep 17 00:00:00 2001 From: Daniel Pepper Date: Fri, 9 Dec 2022 07:59:52 -0800 Subject: [PATCH 2/2] rubocop --- lib/faraday/adapter/test.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/faraday/adapter/test.rb b/lib/faraday/adapter/test.rb index 2765d51d7..7843d8c1a 100644 --- a/lib/faraday/adapter/test.rb +++ b/lib/faraday/adapter/test.rb @@ -280,10 +280,10 @@ def call(env) block_arity = stub.block.arity params = if block_arity >= 0 - [env, meta].take(block_arity) - else - [env, meta] - end + [env, meta].take(block_arity) + else + [env, meta] + end timeout = request_timeout(:open, env[:request]) timeout ||= request_timeout(:read, env[:request]) @@ -297,7 +297,6 @@ def call(env) stub.block.call(*params) end - # We need to explicitly pass `reason_phrase = nil` here to avoid keyword args conflicts. # See https://github.com/lostisland/faraday/issues/1444 # TODO: remove `nil` explicit reason_phrase once Ruby 3.0 becomes minimum req. version