From 25979431e40858c53c069aefe04bc16887ee4393 Mon Sep 17 00:00:00 2001 From: Igor Springer Date: Thu, 18 Jul 2019 11:03:58 +0200 Subject: [PATCH] Add support for setting Ruby Net::HTTP `read_timeout` option separately Right now `timeout` setting sets all the timeout values (`read`, `open` & `write` if available). To unify the API with `Net::HTTP` one (which has a dedicated method for `read_timeout` as well) I propose extending the `RequestOptions` by `read_timeout`. --- lib/faraday/adapter/net_http.rb | 2 ++ lib/faraday/options/request_options.rb | 5 +++-- spec/faraday/adapter/net_http_spec.rb | 10 ++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index d5c0061d..4e879994 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -173,6 +173,8 @@ module Faraday end end http.open_timeout = req[:open_timeout] if req[:open_timeout] + http.read_timeout = req[:read_timeout] if req[:read_timeout] + if req[:write_timeout] && http.respond_to?(:write_timeout=) http.write_timeout = req[:write_timeout] end diff --git a/lib/faraday/options/request_options.rb b/lib/faraday/options/request_options.rb index cca000f8..1a96fb8f 100644 --- a/lib/faraday/options/request_options.rb +++ b/lib/faraday/options/request_options.rb @@ -3,8 +3,9 @@ module Faraday # RequestOptions contains the configurable properties for a Faraday request. class RequestOptions < Options.new(:params_encoder, :proxy, :bind, - :timeout, :open_timeout, :write_timeout, - :boundary, :oauth, :context, :on_data) + :timeout, :open_timeout, :read_timeout, + :write_timeout, :boundary, :oauth, + :context, :on_data) def []=(key, value) if key && key.to_sym == :proxy diff --git a/spec/faraday/adapter/net_http_spec.rb b/spec/faraday/adapter/net_http_spec.rb index 2197ab18..faf762c8 100644 --- a/spec/faraday/adapter/net_http_spec.rb +++ b/spec/faraday/adapter/net_http_spec.rb @@ -21,6 +21,16 @@ RSpec.describe Faraday::Adapter::NetHttp do expect(http.write_timeout).to eq(10) if http.respond_to?(:write_timeout=) end + it 'supports open_timeout' do + adapter.send(:configure_request, http, open_timeout: 10) + + expect(http.open_timeout).to eq(10) + end + it 'supports read_timeout' do + adapter.send(:configure_request, http, read_timeout: 10) + + expect(http.read_timeout).to eq(10) + end context 'with https url' do let(:url) { URI('https://example.com') }