From cd93bddc2f27634059c9d9e0b6c26832b5caaaa2 Mon Sep 17 00:00:00 2001 From: Chris AtLee Date: Thu, 19 Jan 2023 15:08:10 -0500 Subject: [PATCH 1/3] Don't raise_for_status automatically in the Faraday adapter --- lib/httpx/adapters/faraday.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/httpx/adapters/faraday.rb b/lib/httpx/adapters/faraday.rb index 3e26591c..c01420ec 100644 --- a/lib/httpx/adapters/faraday.rb +++ b/lib/httpx/adapters/faraday.rb @@ -210,7 +210,6 @@ module Faraday if parallel?(env) handler = env[:parallel_manager].enqueue(env) handler.on_response do |response| - response.raise_for_status save_response(env, response.status, response.body.to_s, response.headers, response.reason) do |response_headers| response_headers.merge!(response.headers) end @@ -229,7 +228,6 @@ module Faraday request.response_on_data = env.request.on_data if env.request.stream_response? response = session.request(request) - response.raise_for_status unless response.is_a?(::HTTPX::Response) save_response(env, response.status, response.body.to_s, response.headers, response.reason) do |response_headers| response_headers.merge!(response.headers) end From 0c9fcdb60afe34ef020d3c5cf7999115e5a02ebe Mon Sep 17 00:00:00 2001 From: Chris AtLee Date: Thu, 19 Jan 2023 16:13:11 -0500 Subject: [PATCH 2/3] Enable RaiseError middleware --- test/adapters/faraday_test.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/adapters/faraday_test.rb b/test/adapters/faraday_test.rb index 73e492a9..c6f33f07 100644 --- a/test/adapters/faraday_test.rb +++ b/test/adapters/faraday_test.rb @@ -183,6 +183,7 @@ class FaradayTest < Minitest::Test Faraday::Connection.new(server.to_s, options, &builder_block).tap do |conn| conn.headers["X-Faraday-Adapter"] = "httpx" + conn.response :raise_error adapter_handler = conn.builder.handlers.last conn.builder.insert_before adapter_handler, Faraday::Response::RaiseError end From 8dae534bd02c3e481d7a962805d0c59af6610404 Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Fri, 20 Jan 2023 17:08:41 +0000 Subject: [PATCH 3/3] faraday adapter: do not raise errors on parallel requests instead, fill up the response with the same gibberish as typhoeus. --- lib/httpx/adapters/faraday.rb | 10 ++++++++-- test/adapters/faraday_test.rb | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/httpx/adapters/faraday.rb b/lib/httpx/adapters/faraday.rb index c01420ec..6df2d78e 100644 --- a/lib/httpx/adapters/faraday.rb +++ b/lib/httpx/adapters/faraday.rb @@ -210,8 +210,12 @@ module Faraday if parallel?(env) handler = env[:parallel_manager].enqueue(env) handler.on_response do |response| - save_response(env, response.status, response.body.to_s, response.headers, response.reason) do |response_headers| - response_headers.merge!(response.headers) + if response.is_a?(::HTTPX::Response) + save_response(env, response.status, response.body.to_s, response.headers, response.reason) do |response_headers| + response_headers.merge!(response.headers) + end + else + save_response(env, 0, "", {}, nil) end end return handler @@ -228,6 +232,8 @@ module Faraday request.response_on_data = env.request.on_data if env.request.stream_response? response = session.request(request) + # do not call #raise_for_status for HTTP 4xx or 5xx, as faraday has a middleware for that. + response.raise_for_status unless response.is_a?(::HTTPX::Response) save_response(env, response.status, response.body.to_s, response.headers, response.reason) do |response_headers| response_headers.merge!(response.headers) end diff --git a/test/adapters/faraday_test.rb b/test/adapters/faraday_test.rb index c6f33f07..44f5022b 100644 --- a/test/adapters/faraday_test.rb +++ b/test/adapters/faraday_test.rb @@ -29,6 +29,21 @@ class FaradayTest < Minitest::Test assert_equal "OK", resp2.reason_phrase end + def test_adapter_in_parallel_errors + resp1 = nil + + connection = create_connection + connection.in_parallel do + resp1 = connection.get("http://wfijojsfsoijf") + assert connection.in_parallel? + assert_nil resp1.reason_phrase + end + assert !connection.in_parallel? + assert_equal 0, resp1.status + assert_nil resp1.reason_phrase + assert_equal "", resp1.body + end + def test_adapter_get_handles_compression res = get(build_path("/gzip")) assert JSON.parse(res.body.to_s)["gzipped"] @@ -183,7 +198,6 @@ class FaradayTest < Minitest::Test Faraday::Connection.new(server.to_s, options, &builder_block).tap do |conn| conn.headers["X-Faraday-Adapter"] = "httpx" - conn.response :raise_error adapter_handler = conn.builder.handlers.last conn.builder.insert_before adapter_handler, Faraday::Response::RaiseError end