diff --git a/lib/httpx/adapters/faraday.rb b/lib/httpx/adapters/faraday.rb index 3e26591c..6df2d78e 100644 --- a/lib/httpx/adapters/faraday.rb +++ b/lib/httpx/adapters/faraday.rb @@ -210,9 +210,12 @@ 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) + 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 @@ -229,6 +232,7 @@ 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) diff --git a/test/adapters/faraday_test.rb b/test/adapters/faraday_test.rb index 73e492a9..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"]