From 03f373a1fb3ca4b52d84cb2bd8a3027261d0bd50 Mon Sep 17 00:00:00 2001 From: "nicholas a. evans" Date: Mon, 21 Sep 2015 16:58:59 -0400 Subject: [PATCH 1/5] Env custom members should be copied by Env.from(env) Fixes lostisland/faraday#408. If middleware or adapters add custom members to env, those members should be retained. --- lib/faraday/options.rb | 11 +++++++++++ test/env_test.rb | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/faraday/options.rb b/lib/faraday/options.rb index c1b36f60..fc7d6632 100644 --- a/lib/faraday/options.rb +++ b/lib/faraday/options.rb @@ -269,6 +269,17 @@ module Faraday def_delegators :request, :params_encoder + # Public + def self.from(value) + env = super(value) + if value.kind_of?(self) + value.custom_members.each do |custom_key, custom_value| + env[custom_key] = custom_value + end + end + env + end + # Public def [](key) if in_member_set?(key) diff --git a/test/env_test.rb b/test/env_test.rb index 0bbb531e..2074216e 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -70,6 +70,15 @@ class EnvTest < Faraday::TestCase assert_equal 'proxy.com', env.request.proxy.host end + def test_custom_headers_are_retained + env = make_env + env[:foo] = "custom 1" + env[:bar] = :custom_2 + env2 = Faraday::Env.from(env) + assert_equal "custom 1", env2[:foo] + assert_equal :custom_2, env2[:bar] + end + private def make_env(method = :get, connection = @conn, &block) From 441d8ac9794f91a013d0ff3a3b533cdfd0ad4436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 2 Oct 2015 00:06:53 +0200 Subject: [PATCH 2/5] Simplify copying `custom_members` to new Env instance --- lib/faraday/options.rb | 6 ++---- test/env_test.rb | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/faraday/options.rb b/lib/faraday/options.rb index fc7d6632..01bef497 100644 --- a/lib/faraday/options.rb +++ b/lib/faraday/options.rb @@ -272,10 +272,8 @@ module Faraday # Public def self.from(value) env = super(value) - if value.kind_of?(self) - value.custom_members.each do |custom_key, custom_value| - env[custom_key] = custom_value - end + if value.respond_to?(:custom_members) + env.custom_members.update(value.custom_members) end env end diff --git a/test/env_test.rb b/test/env_test.rb index 2074216e..a5e4cf48 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -70,13 +70,15 @@ class EnvTest < Faraday::TestCase assert_equal 'proxy.com', env.request.proxy.host end - def test_custom_headers_are_retained + def test_custom_members_are_retained env = make_env env[:foo] = "custom 1" env[:bar] = :custom_2 env2 = Faraday::Env.from(env) assert_equal "custom 1", env2[:foo] assert_equal :custom_2, env2[:bar] + env2[:baz] = "custom 3" + assert_nil env[:baz] end private From 86e5fa4ee396aadb4a2dc795c68d9c9be0b8cca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 2 Oct 2015 00:20:55 +0200 Subject: [PATCH 3/5] em-http: wrap "connection closed by server" as ConnectionFailed type This is bizarrely returned by em-http when failing to authenticate with the proxy server, but only on Travis and not on my Mac. https://travis-ci.org/lostisland/faraday/jobs/83207905 --- lib/faraday/adapter/em_synchrony.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/faraday/adapter/em_synchrony.rb b/lib/faraday/adapter/em_synchrony.rb index 305e702f..5a766777 100644 --- a/lib/faraday/adapter/em_synchrony.rb +++ b/lib/faraday/adapter/em_synchrony.rb @@ -70,6 +70,12 @@ module Faraday else raise Error::ConnectionFailed, err end + rescue RuntimeError => err + if err.message == "connection closed by server" + raise Error::ConnectionFailed, err + else + raise + end rescue => err if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err raise Faraday::SSLError, err From bc453746c106d69900a0043180464819453bcc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 2 Oct 2015 00:22:51 +0200 Subject: [PATCH 4/5] Output proxy log as well after CI failure --- script/test | 1 + 1 file changed, 1 insertion(+) diff --git a/script/test b/script/test index 180dbdd3..961d0fc3 100755 --- a/script/test +++ b/script/test @@ -132,6 +132,7 @@ if [ -n "$(filter_matching "adapters" "${test_files[@]}")" ]; then cleanup() { if [ $? -ne 0 ] && [ -n "$TRAVIS" ]; then cat log/test.log + cat log/proxy.log fi kill "$server_pid" kill "$proxy_pid" From ab9a0fb4ad24c0740ccc4552d98af15c38b01475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Fri, 2 Oct 2015 01:03:00 +0200 Subject: [PATCH 5/5] Skip proxy auth test for EM due to em-socksify bug --- test/adapters/integration.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/adapters/integration.rb b/test/adapters/integration.rb index 4e0f81cf..800ee388 100644 --- a/test/adapters/integration.rb +++ b/test/adapters/integration.rb @@ -207,8 +207,10 @@ module Adapters conn.get '/echo' end - unless self.class.ssl_mode? && self.class.jruby? + unless self.class.ssl_mode? && (self.class.jruby? || + adapter == :em_http || adapter == :em_synchrony) # JRuby raises "End of file reached" which cannot be distinguished from a 407 + # EM raises "connection closed by server" due to https://github.com/igrigorik/em-socksify/pull/19 assert_equal %{407 "Proxy Authentication Required "}, err.message end end