Open
Conversation
3 similar comments
Contributor
gem compare faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT metadata:
2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
DIFFERENT rubygems_version:
2.13.1: 3.6.7
2.14.1: 3.6.9
DIFFERENT version:
2.13.1: 2.13.1
2.14.1: 2.14.1
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb +2/-1
lib/faraday/connection.rb +3/-2
lib/faraday/encoders/flat_params_encoder.rb +2/-2
lib/faraday/error.rb +42/-5
lib/faraday/logging/formatter.rb +1/-1
lib/faraday/rack_builder.rb +1/-5
lib/faraday/response.rb +7/-3
lib/faraday/response/raise_error.rb +1/-1
lib/faraday/version.rb +1/-1
spec/faraday/connection_spec.rb +33/-0
spec/faraday/error_spec.rb +83/-1
spec/faraday/response/logger_spec.rb +6/-0
spec/faraday/response/raise_error_spec.rb +24/-13
spec/faraday/response_spec.rb +7/-0 |
Contributor
gem compare faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT metadata:
2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
DIFFERENT rubygems_version:
2.13.1: 3.6.7
2.14.1: 3.6.9
DIFFERENT version:
2.13.1: 2.13.1
2.14.1: 2.14.1
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb +2/-1
lib/faraday/connection.rb +3/-2
lib/faraday/encoders/flat_params_encoder.rb +2/-2
lib/faraday/error.rb +42/-5
lib/faraday/logging/formatter.rb +1/-1
lib/faraday/rack_builder.rb +1/-5
lib/faraday/response.rb +7/-3
lib/faraday/response/raise_error.rb +1/-1
lib/faraday/version.rb +1/-1
spec/faraday/connection_spec.rb +33/-0
spec/faraday/error_spec.rb +83/-1
spec/faraday/response/logger_spec.rb +6/-0
spec/faraday/response/raise_error_spec.rb +24/-13
spec/faraday/response_spec.rb +7/-0 |
Contributor
gem compare --diff faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday.rb 2026-02-09 22:17:28.899198366 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday.rb 2026-02-09 22:17:28.908198411 +0000
@@ -3 +3,2 @@
-require 'cgi'
+require 'cgi/escape'
+require 'cgi/util' if RUBY_VERSION < '3.5'
lib/faraday/connection.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/connection.rb 2026-02-09 22:17:28.900198371 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/connection.rb 2026-02-09 22:17:28.909198416 +0000
@@ -484,2 +484,3 @@
- # Ensure relative url will be parsed correctly (such as `service:search` )
- url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
+ # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
+ url = "./#{url}" if url.respond_to?(:start_with?) &&
+ (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
lib/faraday/encoders/flat_params_encoder.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:28.900198371 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:28.909198416 +0000
@@ -79 +79 @@
- split_query = (query.split('&').map do |pair|
+ split_query = query.split('&').filter_map do |pair|
@@ -81 +81 @@
- end).compact
+ end
lib/faraday/error.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/error.rb 2026-02-09 22:17:28.900198371 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/error.rb 2026-02-09 22:17:28.909198416 +0000
@@ -82 +82,25 @@
- return [exc, exc.message, response] if exc.respond_to?(:backtrace)
+ case exc
+ when Exception
+ [exc, exc.message, response]
+ when Hash
+ [nil, build_error_message_from_hash(exc), exc]
+ when Faraday::Env
+ [nil, build_error_message_from_env(exc), exc]
+ else
+ [nil, exc.to_s, response]
+ end
+ end
+
+ private
+
+ def build_error_message_from_hash(hash)
+ # Be defensive with external Hash objects - they might be missing keys
+ status = hash.fetch(:status, nil)
+ request = hash.fetch(:request, nil)
+
+ return fallback_error_message(status) if request.nil?
+
+ method = request.fetch(:method, nil)
+ url = request.fetch(:url, nil)
+ build_status_error_message(status, method, url)
+ end
@@ -84,2 +108,10 @@
- return [nil, "the server responded with status #{exc[:status]}", exc] \
- if exc.respond_to?(:each_key)
+ def build_error_message_from_env(env)
+ # Faraday::Env is internal - we can make reasonable assumptions about its structure
+ build_status_error_message(env.status, env.method, env.url)
+ end
+
+ def build_status_error_message(status, method, url)
+ method_str = method ? method.to_s.upcase : ''
+ url_str = url ? url.to_s : ''
+ "the server responded with status #{status} for #{method_str} #{url_str}"
+ end
@@ -87 +119,3 @@
- [nil, exc.to_s, response]
+ def fallback_error_message(status)
+ "the server responded with status #{status} - method and url are not available " \
+ 'due to include_request: false on Faraday::Response::RaiseError middleware'
@@ -124 +158 @@
- class UnprocessableEntityError < ClientError
+ class UnprocessableContentError < ClientError
@@ -125,0 +160,3 @@
+
+ # Used to provide compatibility with legacy error name.
+ UnprocessableEntityError = UnprocessableContentError
lib/faraday/logging/formatter.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:28.900198371 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:28.909198416 +0000
@@ -66 +66 @@
- body.to_str
+ body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
lib/faraday/rack_builder.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:28.901198376 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:28.910198421 +0000
@@ -224 +224 @@
- return unless is_adapter?(klass)
+ return unless klass <= Faraday::Adapter
@@ -235,4 +234,0 @@
- end
-
- def is_adapter?(klass) # rubocop:disable Naming/PredicateName
- klass <= Faraday::Adapter
lib/faraday/response.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/response.rb 2026-02-09 22:17:28.903198386 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/response.rb 2026-02-09 22:17:28.911198426 +0000
@@ -35,0 +36,4 @@
+ def url
+ finished? ? env.url : nil
+ end
+
@@ -63,3 +67,3 @@
- status: env.status, body: env.body,
- response_headers: env.response_headers,
- url: env.url
+ status: status, body: body,
+ response_headers: headers,
+ url: url
lib/faraday/response/raise_error.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:28.903198386 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:28.911198426 +0000
@@ -18 +18 @@
- 422 => Faraday::UnprocessableEntityError,
+ 422 => Faraday::UnprocessableContentError,
lib/faraday/version.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/version.rb 2026-02-09 22:17:28.903198386 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/version.rb 2026-02-09 22:17:28.911198426 +0000
@@ -4 +4 @@
- VERSION = '2.13.1'
+ VERSION = '2.14.1'
spec/faraday/connection_spec.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:28.904198391 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:28.912198431 +0000
@@ -313,0 +314,33 @@
+ context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
+ it 'does not allow host override with //evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //evil.com:8080/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com:8080/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //user:pass@evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//user:pass@evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with ///evil.com' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('///evil.com')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'still allows single-slash absolute paths' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('/safe/path')
+ expect(uri.host).to eq('httpbingo.org')
+ expect(uri.path).to eq('/safe/path')
+ end
+ end
+
spec/faraday/error_spec.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/error_spec.rb 2026-02-09 22:17:28.904198391 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/error_spec.rb 2026-02-09 22:17:28.912198431 +0000
@@ -26 +26 @@
- it { expect(subject.message).to eq('the server responded with status 400') }
+ it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
@@ -90,0 +91,82 @@
+ end
+
+ context 'with hash missing status key' do
+ let(:exception) { { body: 'error body' } }
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status but missing request data' do
+ let(:exception) { { status: 404, body: 'not found' } } # missing request key
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status and request but missing method in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for http://example.com/test') }
+ end
+
+ context 'with hash with status and request but missing url in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
+ end
+
+ context 'with properly formed Faraday::Env' do
+ # This represents the normal case - a well-formed Faraday::Env object
+ # with all the standard properties populated as they would be during
+ # a typical HTTP request/response cycle
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 500
+ exception.method = :post
+ exception.url = URI('https://api.example.com/users')
+ exception.request = Faraday::RequestOptions.new
+ exception.response_headers = { 'content-type' => 'application/json' }
+ exception.response_body = '{"error": "Internal server error"}'
+ exception.request_headers = { 'authorization' => 'Bearer token123' }
+ exception.request_body = '{"name": "John"}'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
+ end
+
+ context 'with Faraday::Env missing status key' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception[:body] = 'error body'
+ # Intentionally not setting status
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status for ') }
+ end
+
+ context 'with Faraday::Env with direct method and url properties' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 404
+ exception.method = :get
+ exception.url = URI('http://example.com/test')
+ exception[:body] = 'not found'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
spec/faraday/response/logger_spec.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:28.906198401 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:28.914198442 +0000
@@ -23,0 +24 @@
+ stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
@@ -238,0 +240,5 @@
+ end
+
+ it 'converts to UTF-8' do
+ conn.get '/8bit'
+ expect(string_io.string).to match(%(caf��!))
spec/faraday/response/raise_error_spec.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:28.906198401 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:28.914198442 +0000
@@ -16 +16 @@
- stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
+ stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
@@ -31 +31 @@
- expect(ex.message).to eq('the server responded with status 400')
+ expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
@@ -42 +42 @@
- expect(ex.message).to eq('the server responded with status 401')
+ expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
@@ -53 +53 @@
- expect(ex.message).to eq('the server responded with status 403')
+ expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
@@ -64 +64 @@
- expect(ex.message).to eq('the server responded with status 404')
+ expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
@@ -86 +86 @@
- expect(ex.message).to eq('the server responded with status 408')
+ expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
@@ -97 +97 @@
- expect(ex.message).to eq('the server responded with status 409')
+ expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
@@ -106,3 +106,14 @@
- it 'raises Faraday::UnprocessableEntityError for 422 responses' do
- expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
- expect(ex.message).to eq('the server responded with status 422')
+ it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
+ expect(ex.response[:headers]['X-Reason']).to eq('because')
+ expect(ex.response[:status]).to eq(422)
+ expect(ex.response_status).to eq(422)
+ expect(ex.response_body).to eq('keep looking')
+ expect(ex.response_headers['X-Reason']).to eq('because')
+ end
+ end
+
+ it 'raises Faraday::UnprocessableContentError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
@@ -119 +130 @@
- expect(ex.message).to eq('the server responded with status 429')
+ expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
@@ -141 +152 @@
- expect(ex.message).to eq('the server responded with status 499')
+ expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
@@ -152 +163 @@
- expect(ex.message).to eq('the server responded with status 500')
+ expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
spec/faraday/response_spec.rb
--- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/response_spec.rb 2026-02-09 22:17:28.906198401 +0000
+++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/response_spec.rb 2026-02-09 22:17:28.914198442 +0000
@@ -15,0 +16 @@
+ it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
@@ -33,0 +35,6 @@
+
+ context 'when response is not finished' do
+ subject { Faraday::Response.new.to_hash }
+
+ it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
+ end |
Contributor
gem compare faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT metadata:
2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
DIFFERENT rubygems_version:
2.13.1: 3.6.7
2.14.1: 3.6.9
DIFFERENT version:
2.13.1: 2.13.1
2.14.1: 2.14.1
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb +2/-1
lib/faraday/connection.rb +3/-2
lib/faraday/encoders/flat_params_encoder.rb +2/-2
lib/faraday/error.rb +42/-5
lib/faraday/logging/formatter.rb +1/-1
lib/faraday/rack_builder.rb +1/-5
lib/faraday/response.rb +7/-3
lib/faraday/response/raise_error.rb +1/-1
lib/faraday/version.rb +1/-1
spec/faraday/connection_spec.rb +33/-0
spec/faraday/error_spec.rb +83/-1
spec/faraday/response/logger_spec.rb +6/-0
spec/faraday/response/raise_error_spec.rb +24/-13
spec/faraday/response_spec.rb +7/-0 |
Contributor
gem compare --diff faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday.rb 2026-02-09 22:17:35.432759639 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday.rb 2026-02-09 22:17:35.442759743 +0000
@@ -3 +3,2 @@
-require 'cgi'
+require 'cgi/escape'
+require 'cgi/util' if RUBY_VERSION < '3.5'
lib/faraday/connection.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/connection.rb 2026-02-09 22:17:35.433759650 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/connection.rb 2026-02-09 22:17:35.442759743 +0000
@@ -484,2 +484,3 @@
- # Ensure relative url will be parsed correctly (such as `service:search` )
- url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
+ # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
+ url = "./#{url}" if url.respond_to?(:start_with?) &&
+ (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
lib/faraday/encoders/flat_params_encoder.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:35.433759650 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:35.442759743 +0000
@@ -79 +79 @@
- split_query = (query.split('&').map do |pair|
+ split_query = query.split('&').filter_map do |pair|
@@ -81 +81 @@
- end).compact
+ end
lib/faraday/error.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/error.rb 2026-02-09 22:17:35.433759650 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/error.rb 2026-02-09 22:17:35.443759754 +0000
@@ -82 +82,25 @@
- return [exc, exc.message, response] if exc.respond_to?(:backtrace)
+ case exc
+ when Exception
+ [exc, exc.message, response]
+ when Hash
+ [nil, build_error_message_from_hash(exc), exc]
+ when Faraday::Env
+ [nil, build_error_message_from_env(exc), exc]
+ else
+ [nil, exc.to_s, response]
+ end
+ end
+
+ private
+
+ def build_error_message_from_hash(hash)
+ # Be defensive with external Hash objects - they might be missing keys
+ status = hash.fetch(:status, nil)
+ request = hash.fetch(:request, nil)
+
+ return fallback_error_message(status) if request.nil?
+
+ method = request.fetch(:method, nil)
+ url = request.fetch(:url, nil)
+ build_status_error_message(status, method, url)
+ end
@@ -84,2 +108,10 @@
- return [nil, "the server responded with status #{exc[:status]}", exc] \
- if exc.respond_to?(:each_key)
+ def build_error_message_from_env(env)
+ # Faraday::Env is internal - we can make reasonable assumptions about its structure
+ build_status_error_message(env.status, env.method, env.url)
+ end
+
+ def build_status_error_message(status, method, url)
+ method_str = method ? method.to_s.upcase : ''
+ url_str = url ? url.to_s : ''
+ "the server responded with status #{status} for #{method_str} #{url_str}"
+ end
@@ -87 +119,3 @@
- [nil, exc.to_s, response]
+ def fallback_error_message(status)
+ "the server responded with status #{status} - method and url are not available " \
+ 'due to include_request: false on Faraday::Response::RaiseError middleware'
@@ -124 +158 @@
- class UnprocessableEntityError < ClientError
+ class UnprocessableContentError < ClientError
@@ -125,0 +160,3 @@
+
+ # Used to provide compatibility with legacy error name.
+ UnprocessableEntityError = UnprocessableContentError
lib/faraday/logging/formatter.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:35.433759650 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:35.443759754 +0000
@@ -66 +66 @@
- body.to_str
+ body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
lib/faraday/rack_builder.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:35.434759660 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:35.444759764 +0000
@@ -224 +224 @@
- return unless is_adapter?(klass)
+ return unless klass <= Faraday::Adapter
@@ -235,4 +234,0 @@
- end
-
- def is_adapter?(klass) # rubocop:disable Naming/PredicateName
- klass <= Faraday::Adapter
lib/faraday/response.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/response.rb 2026-02-09 22:17:35.435759671 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/response.rb 2026-02-09 22:17:35.444759764 +0000
@@ -35,0 +36,4 @@
+ def url
+ finished? ? env.url : nil
+ end
+
@@ -63,3 +67,3 @@
- status: env.status, body: env.body,
- response_headers: env.response_headers,
- url: env.url
+ status: status, body: body,
+ response_headers: headers,
+ url: url
lib/faraday/response/raise_error.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:35.436759681 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:35.445759775 +0000
@@ -18 +18 @@
- 422 => Faraday::UnprocessableEntityError,
+ 422 => Faraday::UnprocessableContentError,
lib/faraday/version.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/version.rb 2026-02-09 22:17:35.436759681 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/version.rb 2026-02-09 22:17:35.445759775 +0000
@@ -4 +4 @@
- VERSION = '2.13.1'
+ VERSION = '2.14.1'
spec/faraday/connection_spec.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:35.437759691 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:35.446759785 +0000
@@ -313,0 +314,33 @@
+ context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
+ it 'does not allow host override with //evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //evil.com:8080/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com:8080/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //user:pass@evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//user:pass@evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with ///evil.com' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('///evil.com')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'still allows single-slash absolute paths' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('/safe/path')
+ expect(uri.host).to eq('httpbingo.org')
+ expect(uri.path).to eq('/safe/path')
+ end
+ end
+
spec/faraday/error_spec.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/error_spec.rb 2026-02-09 22:17:35.437759691 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/error_spec.rb 2026-02-09 22:17:35.446759785 +0000
@@ -26 +26 @@
- it { expect(subject.message).to eq('the server responded with status 400') }
+ it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
@@ -90,0 +91,82 @@
+ end
+
+ context 'with hash missing status key' do
+ let(:exception) { { body: 'error body' } }
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status but missing request data' do
+ let(:exception) { { status: 404, body: 'not found' } } # missing request key
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status and request but missing method in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for http://example.com/test') }
+ end
+
+ context 'with hash with status and request but missing url in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
+ end
+
+ context 'with properly formed Faraday::Env' do
+ # This represents the normal case - a well-formed Faraday::Env object
+ # with all the standard properties populated as they would be during
+ # a typical HTTP request/response cycle
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 500
+ exception.method = :post
+ exception.url = URI('https://api.example.com/users')
+ exception.request = Faraday::RequestOptions.new
+ exception.response_headers = { 'content-type' => 'application/json' }
+ exception.response_body = '{"error": "Internal server error"}'
+ exception.request_headers = { 'authorization' => 'Bearer token123' }
+ exception.request_body = '{"name": "John"}'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
+ end
+
+ context 'with Faraday::Env missing status key' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception[:body] = 'error body'
+ # Intentionally not setting status
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status for ') }
+ end
+
+ context 'with Faraday::Env with direct method and url properties' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 404
+ exception.method = :get
+ exception.url = URI('http://example.com/test')
+ exception[:body] = 'not found'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
spec/faraday/response/logger_spec.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:35.439759712 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:35.448759806 +0000
@@ -23,0 +24 @@
+ stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
@@ -238,0 +240,5 @@
+ end
+
+ it 'converts to UTF-8' do
+ conn.get '/8bit'
+ expect(string_io.string).to match(%(caf��!))
spec/faraday/response/raise_error_spec.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:35.439759712 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:35.448759806 +0000
@@ -16 +16 @@
- stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
+ stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
@@ -31 +31 @@
- expect(ex.message).to eq('the server responded with status 400')
+ expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
@@ -42 +42 @@
- expect(ex.message).to eq('the server responded with status 401')
+ expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
@@ -53 +53 @@
- expect(ex.message).to eq('the server responded with status 403')
+ expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
@@ -64 +64 @@
- expect(ex.message).to eq('the server responded with status 404')
+ expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
@@ -86 +86 @@
- expect(ex.message).to eq('the server responded with status 408')
+ expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
@@ -97 +97 @@
- expect(ex.message).to eq('the server responded with status 409')
+ expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
@@ -106,3 +106,14 @@
- it 'raises Faraday::UnprocessableEntityError for 422 responses' do
- expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
- expect(ex.message).to eq('the server responded with status 422')
+ it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
+ expect(ex.response[:headers]['X-Reason']).to eq('because')
+ expect(ex.response[:status]).to eq(422)
+ expect(ex.response_status).to eq(422)
+ expect(ex.response_body).to eq('keep looking')
+ expect(ex.response_headers['X-Reason']).to eq('because')
+ end
+ end
+
+ it 'raises Faraday::UnprocessableContentError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
@@ -119 +130 @@
- expect(ex.message).to eq('the server responded with status 429')
+ expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
@@ -141 +152 @@
- expect(ex.message).to eq('the server responded with status 499')
+ expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
@@ -152 +163 @@
- expect(ex.message).to eq('the server responded with status 500')
+ expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
spec/faraday/response_spec.rb
--- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/response_spec.rb 2026-02-09 22:17:35.439759712 +0000
+++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/response_spec.rb 2026-02-09 22:17:35.448759806 +0000
@@ -15,0 +16 @@
+ it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
@@ -33,0 +35,6 @@
+
+ context 'when response is not finished' do
+ subject { Faraday::Response.new.to_hash }
+
+ it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
+ end |
Contributor
gem compare faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT metadata:
2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
DIFFERENT rubygems_version:
2.13.1: 3.6.7
2.14.1: 3.6.9
DIFFERENT version:
2.13.1: 2.13.1
2.14.1: 2.14.1
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb +2/-1
lib/faraday/connection.rb +3/-2
lib/faraday/encoders/flat_params_encoder.rb +2/-2
lib/faraday/error.rb +42/-5
lib/faraday/logging/formatter.rb +1/-1
lib/faraday/rack_builder.rb +1/-5
lib/faraday/response.rb +7/-3
lib/faraday/response/raise_error.rb +1/-1
lib/faraday/version.rb +1/-1
spec/faraday/connection_spec.rb +33/-0
spec/faraday/error_spec.rb +83/-1
spec/faraday/response/logger_spec.rb +6/-0
spec/faraday/response/raise_error_spec.rb +24/-13
spec/faraday/response_spec.rb +7/-0 |
1 similar comment
Contributor
gem compare faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT metadata:
2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
DIFFERENT rubygems_version:
2.13.1: 3.6.7
2.14.1: 3.6.9
DIFFERENT version:
2.13.1: 2.13.1
2.14.1: 2.14.1
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb +2/-1
lib/faraday/connection.rb +3/-2
lib/faraday/encoders/flat_params_encoder.rb +2/-2
lib/faraday/error.rb +42/-5
lib/faraday/logging/formatter.rb +1/-1
lib/faraday/rack_builder.rb +1/-5
lib/faraday/response.rb +7/-3
lib/faraday/response/raise_error.rb +1/-1
lib/faraday/version.rb +1/-1
spec/faraday/connection_spec.rb +33/-0
spec/faraday/error_spec.rb +83/-1
spec/faraday/response/logger_spec.rb +6/-0
spec/faraday/response/raise_error_spec.rb +24/-13
spec/faraday/response_spec.rb +7/-0 |
Contributor
gem compare faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT metadata:
3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
DIFFERENT version:
3.4.1: 3.4.1
3.4.2: 3.4.2
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb +1/-1
DIFFERENT runtime dependencies:
3.4.1->3.4.2:
* Updated:
net-http from: [">= 0.5.0"] to: ["~> 0.5"] |
Contributor
gem compare --diff faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday.rb 2026-02-09 22:17:47.838920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday.rb 2026-02-09 22:17:47.847920747 +0000
@@ -3 +3,2 @@
-require 'cgi'
+require 'cgi/escape'
+require 'cgi/util' if RUBY_VERSION < '3.5'
lib/faraday/connection.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/connection.rb 2026-02-09 22:17:47.838920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/connection.rb 2026-02-09 22:17:47.848920748 +0000
@@ -484,2 +484,3 @@
- # Ensure relative url will be parsed correctly (such as `service:search` )
- url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
+ # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
+ url = "./#{url}" if url.respond_to?(:start_with?) &&
+ (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
lib/faraday/encoders/flat_params_encoder.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:47.838920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:47.848920748 +0000
@@ -79 +79 @@
- split_query = (query.split('&').map do |pair|
+ split_query = query.split('&').filter_map do |pair|
@@ -81 +81 @@
- end).compact
+ end
lib/faraday/error.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/error.rb 2026-02-09 22:17:47.839920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/error.rb 2026-02-09 22:17:47.848920748 +0000
@@ -82 +82,25 @@
- return [exc, exc.message, response] if exc.respond_to?(:backtrace)
+ case exc
+ when Exception
+ [exc, exc.message, response]
+ when Hash
+ [nil, build_error_message_from_hash(exc), exc]
+ when Faraday::Env
+ [nil, build_error_message_from_env(exc), exc]
+ else
+ [nil, exc.to_s, response]
+ end
+ end
+
+ private
+
+ def build_error_message_from_hash(hash)
+ # Be defensive with external Hash objects - they might be missing keys
+ status = hash.fetch(:status, nil)
+ request = hash.fetch(:request, nil)
+
+ return fallback_error_message(status) if request.nil?
+
+ method = request.fetch(:method, nil)
+ url = request.fetch(:url, nil)
+ build_status_error_message(status, method, url)
+ end
@@ -84,2 +108,10 @@
- return [nil, "the server responded with status #{exc[:status]}", exc] \
- if exc.respond_to?(:each_key)
+ def build_error_message_from_env(env)
+ # Faraday::Env is internal - we can make reasonable assumptions about its structure
+ build_status_error_message(env.status, env.method, env.url)
+ end
+
+ def build_status_error_message(status, method, url)
+ method_str = method ? method.to_s.upcase : ''
+ url_str = url ? url.to_s : ''
+ "the server responded with status #{status} for #{method_str} #{url_str}"
+ end
@@ -87 +119,3 @@
- [nil, exc.to_s, response]
+ def fallback_error_message(status)
+ "the server responded with status #{status} - method and url are not available " \
+ 'due to include_request: false on Faraday::Response::RaiseError middleware'
@@ -124 +158 @@
- class UnprocessableEntityError < ClientError
+ class UnprocessableContentError < ClientError
@@ -125,0 +160,3 @@
+
+ # Used to provide compatibility with legacy error name.
+ UnprocessableEntityError = UnprocessableContentError
lib/faraday/logging/formatter.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:47.839920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:47.848920748 +0000
@@ -66 +66 @@
- body.to_str
+ body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
lib/faraday/rack_builder.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:47.840920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:47.849920748 +0000
@@ -224 +224 @@
- return unless is_adapter?(klass)
+ return unless klass <= Faraday::Adapter
@@ -235,4 +234,0 @@
- end
-
- def is_adapter?(klass) # rubocop:disable Naming/PredicateName
- klass <= Faraday::Adapter
lib/faraday/response.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/response.rb 2026-02-09 22:17:47.841920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/response.rb 2026-02-09 22:17:47.850920748 +0000
@@ -35,0 +36,4 @@
+ def url
+ finished? ? env.url : nil
+ end
+
@@ -63,3 +67,3 @@
- status: env.status, body: env.body,
- response_headers: env.response_headers,
- url: env.url
+ status: status, body: body,
+ response_headers: headers,
+ url: url
lib/faraday/response/raise_error.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:47.841920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:47.850920748 +0000
@@ -18 +18 @@
- 422 => Faraday::UnprocessableEntityError,
+ 422 => Faraday::UnprocessableContentError,
lib/faraday/version.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/version.rb 2026-02-09 22:17:47.842920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/version.rb 2026-02-09 22:17:47.851920748 +0000
@@ -4 +4 @@
- VERSION = '2.13.1'
+ VERSION = '2.14.1'
spec/faraday/connection_spec.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:47.842920746 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:47.851920748 +0000
@@ -313,0 +314,33 @@
+ context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
+ it 'does not allow host override with //evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //evil.com:8080/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com:8080/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //user:pass@evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//user:pass@evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with ///evil.com' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('///evil.com')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'still allows single-slash absolute paths' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('/safe/path')
+ expect(uri.host).to eq('httpbingo.org')
+ expect(uri.path).to eq('/safe/path')
+ end
+ end
+
spec/faraday/error_spec.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/error_spec.rb 2026-02-09 22:17:47.843920747 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/error_spec.rb 2026-02-09 22:17:47.851920748 +0000
@@ -26 +26 @@
- it { expect(subject.message).to eq('the server responded with status 400') }
+ it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
@@ -90,0 +91,82 @@
+ end
+
+ context 'with hash missing status key' do
+ let(:exception) { { body: 'error body' } }
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status but missing request data' do
+ let(:exception) { { status: 404, body: 'not found' } } # missing request key
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status and request but missing method in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for http://example.com/test') }
+ end
+
+ context 'with hash with status and request but missing url in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
+ end
+
+ context 'with properly formed Faraday::Env' do
+ # This represents the normal case - a well-formed Faraday::Env object
+ # with all the standard properties populated as they would be during
+ # a typical HTTP request/response cycle
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 500
+ exception.method = :post
+ exception.url = URI('https://api.example.com/users')
+ exception.request = Faraday::RequestOptions.new
+ exception.response_headers = { 'content-type' => 'application/json' }
+ exception.response_body = '{"error": "Internal server error"}'
+ exception.request_headers = { 'authorization' => 'Bearer token123' }
+ exception.request_body = '{"name": "John"}'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
+ end
+
+ context 'with Faraday::Env missing status key' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception[:body] = 'error body'
+ # Intentionally not setting status
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status for ') }
+ end
+
+ context 'with Faraday::Env with direct method and url properties' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 404
+ exception.method = :get
+ exception.url = URI('http://example.com/test')
+ exception[:body] = 'not found'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
spec/faraday/response/logger_spec.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:47.844920747 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:47.853920749 +0000
@@ -23,0 +24 @@
+ stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
@@ -238,0 +240,5 @@
+ end
+
+ it 'converts to UTF-8' do
+ conn.get '/8bit'
+ expect(string_io.string).to match(%(caf��!))
spec/faraday/response/raise_error_spec.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:47.844920747 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:47.853920749 +0000
@@ -16 +16 @@
- stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
+ stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
@@ -31 +31 @@
- expect(ex.message).to eq('the server responded with status 400')
+ expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
@@ -42 +42 @@
- expect(ex.message).to eq('the server responded with status 401')
+ expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
@@ -53 +53 @@
- expect(ex.message).to eq('the server responded with status 403')
+ expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
@@ -64 +64 @@
- expect(ex.message).to eq('the server responded with status 404')
+ expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
@@ -86 +86 @@
- expect(ex.message).to eq('the server responded with status 408')
+ expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
@@ -97 +97 @@
- expect(ex.message).to eq('the server responded with status 409')
+ expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
@@ -106,3 +106,14 @@
- it 'raises Faraday::UnprocessableEntityError for 422 responses' do
- expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
- expect(ex.message).to eq('the server responded with status 422')
+ it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
+ expect(ex.response[:headers]['X-Reason']).to eq('because')
+ expect(ex.response[:status]).to eq(422)
+ expect(ex.response_status).to eq(422)
+ expect(ex.response_body).to eq('keep looking')
+ expect(ex.response_headers['X-Reason']).to eq('because')
+ end
+ end
+
+ it 'raises Faraday::UnprocessableContentError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
@@ -119 +130 @@
- expect(ex.message).to eq('the server responded with status 429')
+ expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
@@ -141 +152 @@
- expect(ex.message).to eq('the server responded with status 499')
+ expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
@@ -152 +163 @@
- expect(ex.message).to eq('the server responded with status 500')
+ expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
spec/faraday/response_spec.rb
--- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/response_spec.rb 2026-02-09 22:17:47.844920747 +0000
+++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/response_spec.rb 2026-02-09 22:17:47.854920749 +0000
@@ -15,0 +16 @@
+ it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
@@ -33,0 +35,6 @@
+
+ context 'when response is not finished' do
+ subject { Faraday::Response.new.to_hash }
+
+ it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
+ end |
Contributor
gem compare faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT metadata:
3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
DIFFERENT version:
3.4.1: 3.4.1
3.4.2: 3.4.2
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb +1/-1
DIFFERENT runtime dependencies:
3.4.1->3.4.2:
* Updated:
net-http from: [">= 0.5.0"] to: ["~> 0.5"] |
Contributor
gem compare --diff faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday.rb 2026-02-09 22:17:50.536074188 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday.rb 2026-02-09 22:17:50.545074235 +0000
@@ -3 +3,2 @@
-require 'cgi'
+require 'cgi/escape'
+require 'cgi/util' if RUBY_VERSION < '3.5'
lib/faraday/connection.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/connection.rb 2026-02-09 22:17:50.537074193 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/connection.rb 2026-02-09 22:17:50.546074240 +0000
@@ -484,2 +484,3 @@
- # Ensure relative url will be parsed correctly (such as `service:search` )
- url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
+ # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
+ url = "./#{url}" if url.respond_to?(:start_with?) &&
+ (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
lib/faraday/encoders/flat_params_encoder.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:50.537074193 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:50.546074240 +0000
@@ -79 +79 @@
- split_query = (query.split('&').map do |pair|
+ split_query = query.split('&').filter_map do |pair|
@@ -81 +81 @@
- end).compact
+ end
lib/faraday/error.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/error.rb 2026-02-09 22:17:50.537074193 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/error.rb 2026-02-09 22:17:50.546074240 +0000
@@ -82 +82,25 @@
- return [exc, exc.message, response] if exc.respond_to?(:backtrace)
+ case exc
+ when Exception
+ [exc, exc.message, response]
+ when Hash
+ [nil, build_error_message_from_hash(exc), exc]
+ when Faraday::Env
+ [nil, build_error_message_from_env(exc), exc]
+ else
+ [nil, exc.to_s, response]
+ end
+ end
+
+ private
+
+ def build_error_message_from_hash(hash)
+ # Be defensive with external Hash objects - they might be missing keys
+ status = hash.fetch(:status, nil)
+ request = hash.fetch(:request, nil)
+
+ return fallback_error_message(status) if request.nil?
+
+ method = request.fetch(:method, nil)
+ url = request.fetch(:url, nil)
+ build_status_error_message(status, method, url)
+ end
@@ -84,2 +108,10 @@
- return [nil, "the server responded with status #{exc[:status]}", exc] \
- if exc.respond_to?(:each_key)
+ def build_error_message_from_env(env)
+ # Faraday::Env is internal - we can make reasonable assumptions about its structure
+ build_status_error_message(env.status, env.method, env.url)
+ end
+
+ def build_status_error_message(status, method, url)
+ method_str = method ? method.to_s.upcase : ''
+ url_str = url ? url.to_s : ''
+ "the server responded with status #{status} for #{method_str} #{url_str}"
+ end
@@ -87 +119,3 @@
- [nil, exc.to_s, response]
+ def fallback_error_message(status)
+ "the server responded with status #{status} - method and url are not available " \
+ 'due to include_request: false on Faraday::Response::RaiseError middleware'
@@ -124 +158 @@
- class UnprocessableEntityError < ClientError
+ class UnprocessableContentError < ClientError
@@ -125,0 +160,3 @@
+
+ # Used to provide compatibility with legacy error name.
+ UnprocessableEntityError = UnprocessableContentError
lib/faraday/logging/formatter.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:50.537074193 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:50.546074240 +0000
@@ -66 +66 @@
- body.to_str
+ body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
lib/faraday/rack_builder.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:50.538074199 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:50.547074245 +0000
@@ -224 +224 @@
- return unless is_adapter?(klass)
+ return unless klass <= Faraday::Adapter
@@ -235,4 +234,0 @@
- end
-
- def is_adapter?(klass) # rubocop:disable Naming/PredicateName
- klass <= Faraday::Adapter
lib/faraday/response.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/response.rb 2026-02-09 22:17:50.540074209 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/response.rb 2026-02-09 22:17:50.548074250 +0000
@@ -35,0 +36,4 @@
+ def url
+ finished? ? env.url : nil
+ end
+
@@ -63,3 +67,3 @@
- status: env.status, body: env.body,
- response_headers: env.response_headers,
- url: env.url
+ status: status, body: body,
+ response_headers: headers,
+ url: url
lib/faraday/response/raise_error.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:50.540074209 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:50.548074250 +0000
@@ -18 +18 @@
- 422 => Faraday::UnprocessableEntityError,
+ 422 => Faraday::UnprocessableContentError,
lib/faraday/version.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/version.rb 2026-02-09 22:17:50.540074209 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/version.rb 2026-02-09 22:17:50.549074256 +0000
@@ -4 +4 @@
- VERSION = '2.13.1'
+ VERSION = '2.14.1'
spec/faraday/connection_spec.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:50.541074214 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:50.549074256 +0000
@@ -313,0 +314,33 @@
+ context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
+ it 'does not allow host override with //evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //evil.com:8080/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com:8080/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //user:pass@evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//user:pass@evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with ///evil.com' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('///evil.com')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'still allows single-slash absolute paths' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('/safe/path')
+ expect(uri.host).to eq('httpbingo.org')
+ expect(uri.path).to eq('/safe/path')
+ end
+ end
+
spec/faraday/error_spec.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/error_spec.rb 2026-02-09 22:17:50.541074214 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/error_spec.rb 2026-02-09 22:17:50.550074261 +0000
@@ -26 +26 @@
- it { expect(subject.message).to eq('the server responded with status 400') }
+ it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
@@ -90,0 +91,82 @@
+ end
+
+ context 'with hash missing status key' do
+ let(:exception) { { body: 'error body' } }
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status but missing request data' do
+ let(:exception) { { status: 404, body: 'not found' } } # missing request key
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status and request but missing method in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for http://example.com/test') }
+ end
+
+ context 'with hash with status and request but missing url in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
+ end
+
+ context 'with properly formed Faraday::Env' do
+ # This represents the normal case - a well-formed Faraday::Env object
+ # with all the standard properties populated as they would be during
+ # a typical HTTP request/response cycle
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 500
+ exception.method = :post
+ exception.url = URI('https://api.example.com/users')
+ exception.request = Faraday::RequestOptions.new
+ exception.response_headers = { 'content-type' => 'application/json' }
+ exception.response_body = '{"error": "Internal server error"}'
+ exception.request_headers = { 'authorization' => 'Bearer token123' }
+ exception.request_body = '{"name": "John"}'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
+ end
+
+ context 'with Faraday::Env missing status key' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception[:body] = 'error body'
+ # Intentionally not setting status
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status for ') }
+ end
+
+ context 'with Faraday::Env with direct method and url properties' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 404
+ exception.method = :get
+ exception.url = URI('http://example.com/test')
+ exception[:body] = 'not found'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
spec/faraday/response/logger_spec.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:50.543074225 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:50.551074266 +0000
@@ -23,0 +24 @@
+ stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
@@ -238,0 +240,5 @@
+ end
+
+ it 'converts to UTF-8' do
+ conn.get '/8bit'
+ expect(string_io.string).to match(%(caf��!))
spec/faraday/response/raise_error_spec.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:50.543074225 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:50.551074266 +0000
@@ -16 +16 @@
- stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
+ stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
@@ -31 +31 @@
- expect(ex.message).to eq('the server responded with status 400')
+ expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
@@ -42 +42 @@
- expect(ex.message).to eq('the server responded with status 401')
+ expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
@@ -53 +53 @@
- expect(ex.message).to eq('the server responded with status 403')
+ expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
@@ -64 +64 @@
- expect(ex.message).to eq('the server responded with status 404')
+ expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
@@ -86 +86 @@
- expect(ex.message).to eq('the server responded with status 408')
+ expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
@@ -97 +97 @@
- expect(ex.message).to eq('the server responded with status 409')
+ expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
@@ -106,3 +106,14 @@
- it 'raises Faraday::UnprocessableEntityError for 422 responses' do
- expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
- expect(ex.message).to eq('the server responded with status 422')
+ it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
+ expect(ex.response[:headers]['X-Reason']).to eq('because')
+ expect(ex.response[:status]).to eq(422)
+ expect(ex.response_status).to eq(422)
+ expect(ex.response_body).to eq('keep looking')
+ expect(ex.response_headers['X-Reason']).to eq('because')
+ end
+ end
+
+ it 'raises Faraday::UnprocessableContentError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
@@ -119 +130 @@
- expect(ex.message).to eq('the server responded with status 429')
+ expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
@@ -141 +152 @@
- expect(ex.message).to eq('the server responded with status 499')
+ expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
@@ -152 +163 @@
- expect(ex.message).to eq('the server responded with status 500')
+ expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
spec/faraday/response_spec.rb
--- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/response_spec.rb 2026-02-09 22:17:50.543074225 +0000
+++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/response_spec.rb 2026-02-09 22:17:50.551074266 +0000
@@ -15,0 +16 @@
+ it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
@@ -33,0 +35,6 @@
+
+ context 'when response is not finished' do
+ subject { Faraday::Response.new.to_hash }
+
+ it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
+ end |
Contributor
gem compare --diff faraday 2.13.1 2.14.1Compared versions: ["2.13.1", "2.14.1"]
DIFFERENT files:
2.13.1->2.14.1:
* Changed:
lib/faraday.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday.rb 2026-02-09 22:17:51.849963539 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday.rb 2026-02-09 22:17:51.865963568 +0000
@@ -3 +3,2 @@
-require 'cgi'
+require 'cgi/escape'
+require 'cgi/util' if RUBY_VERSION < '3.5'
lib/faraday/connection.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/connection.rb 2026-02-09 22:17:51.850963541 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/connection.rb 2026-02-09 22:17:51.868963574 +0000
@@ -484,2 +484,3 @@
- # Ensure relative url will be parsed correctly (such as `service:search` )
- url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
+ # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
+ url = "./#{url}" if url.respond_to?(:start_with?) &&
+ (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
lib/faraday/encoders/flat_params_encoder.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:51.850963541 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb 2026-02-09 22:17:51.868963574 +0000
@@ -79 +79 @@
- split_query = (query.split('&').map do |pair|
+ split_query = query.split('&').filter_map do |pair|
@@ -81 +81 @@
- end).compact
+ end
lib/faraday/error.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/error.rb 2026-02-09 22:17:51.850963541 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/error.rb 2026-02-09 22:17:51.870963577 +0000
@@ -82 +82,25 @@
- return [exc, exc.message, response] if exc.respond_to?(:backtrace)
+ case exc
+ when Exception
+ [exc, exc.message, response]
+ when Hash
+ [nil, build_error_message_from_hash(exc), exc]
+ when Faraday::Env
+ [nil, build_error_message_from_env(exc), exc]
+ else
+ [nil, exc.to_s, response]
+ end
+ end
+
+ private
+
+ def build_error_message_from_hash(hash)
+ # Be defensive with external Hash objects - they might be missing keys
+ status = hash.fetch(:status, nil)
+ request = hash.fetch(:request, nil)
+
+ return fallback_error_message(status) if request.nil?
+
+ method = request.fetch(:method, nil)
+ url = request.fetch(:url, nil)
+ build_status_error_message(status, method, url)
+ end
@@ -84,2 +108,10 @@
- return [nil, "the server responded with status #{exc[:status]}", exc] \
- if exc.respond_to?(:each_key)
+ def build_error_message_from_env(env)
+ # Faraday::Env is internal - we can make reasonable assumptions about its structure
+ build_status_error_message(env.status, env.method, env.url)
+ end
+
+ def build_status_error_message(status, method, url)
+ method_str = method ? method.to_s.upcase : ''
+ url_str = url ? url.to_s : ''
+ "the server responded with status #{status} for #{method_str} #{url_str}"
+ end
@@ -87 +119,3 @@
- [nil, exc.to_s, response]
+ def fallback_error_message(status)
+ "the server responded with status #{status} - method and url are not available " \
+ 'due to include_request: false on Faraday::Response::RaiseError middleware'
@@ -124 +158 @@
- class UnprocessableEntityError < ClientError
+ class UnprocessableContentError < ClientError
@@ -125,0 +160,3 @@
+
+ # Used to provide compatibility with legacy error name.
+ UnprocessableEntityError = UnprocessableContentError
lib/faraday/logging/formatter.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:51.852963544 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/logging/formatter.rb 2026-02-09 22:17:51.870963577 +0000
@@ -66 +66 @@
- body.to_str
+ body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
lib/faraday/rack_builder.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:51.855963550 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/rack_builder.rb 2026-02-09 22:17:51.872963581 +0000
@@ -224 +224 @@
- return unless is_adapter?(klass)
+ return unless klass <= Faraday::Adapter
@@ -235,4 +234,0 @@
- end
-
- def is_adapter?(klass) # rubocop:disable Naming/PredicateName
- klass <= Faraday::Adapter
lib/faraday/response.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/response.rb 2026-02-09 22:17:51.856963552 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/response.rb 2026-02-09 22:17:51.875963587 +0000
@@ -35,0 +36,4 @@
+ def url
+ finished? ? env.url : nil
+ end
+
@@ -63,3 +67,3 @@
- status: env.status, body: env.body,
- response_headers: env.response_headers,
- url: env.url
+ status: status, body: body,
+ response_headers: headers,
+ url: url
lib/faraday/response/raise_error.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:51.857963554 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/response/raise_error.rb 2026-02-09 22:17:51.875963587 +0000
@@ -18 +18 @@
- 422 => Faraday::UnprocessableEntityError,
+ 422 => Faraday::UnprocessableContentError,
lib/faraday/version.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/version.rb 2026-02-09 22:17:51.857963554 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/version.rb 2026-02-09 22:17:51.876963589 +0000
@@ -4 +4 @@
- VERSION = '2.13.1'
+ VERSION = '2.14.1'
spec/faraday/connection_spec.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:51.859963557 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/connection_spec.rb 2026-02-09 22:17:51.877963590 +0000
@@ -313,0 +314,33 @@
+ context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
+ it 'does not allow host override with //evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //evil.com:8080/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//evil.com:8080/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with //user:pass@evil.com/path' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('//user:pass@evil.com/path')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'does not allow host override with ///evil.com' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('///evil.com')
+ expect(uri.host).to eq('httpbingo.org')
+ end
+
+ it 'still allows single-slash absolute paths' do
+ conn.url_prefix = 'http://httpbingo.org/api'
+ uri = conn.build_exclusive_url('/safe/path')
+ expect(uri.host).to eq('httpbingo.org')
+ expect(uri.path).to eq('/safe/path')
+ end
+ end
+
spec/faraday/error_spec.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/error_spec.rb 2026-02-09 22:17:51.859963557 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/error_spec.rb 2026-02-09 22:17:51.877963590 +0000
@@ -26 +26 @@
- it { expect(subject.message).to eq('the server responded with status 400') }
+ it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
@@ -90,0 +91,82 @@
+ end
+
+ context 'with hash missing status key' do
+ let(:exception) { { body: 'error body' } }
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status but missing request data' do
+ let(:exception) { { status: 404, body: 'not found' } } # missing request key
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
+ end
+
+ context 'with hash with status and request but missing method in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for http://example.com/test') }
+ end
+
+ context 'with hash with status and request but missing url in request' do
+ let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
+ end
+
+ context 'with properly formed Faraday::Env' do
+ # This represents the normal case - a well-formed Faraday::Env object
+ # with all the standard properties populated as they would be during
+ # a typical HTTP request/response cycle
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 500
+ exception.method = :post
+ exception.url = URI('https://api.example.com/users')
+ exception.request = Faraday::RequestOptions.new
+ exception.response_headers = { 'content-type' => 'application/json' }
+ exception.response_body = '{"error": "Internal server error"}'
+ exception.request_headers = { 'authorization' => 'Bearer token123' }
+ exception.request_body = '{"name": "John"}'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
+ end
+
+ context 'with Faraday::Env missing status key' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception[:body] = 'error body'
+ # Intentionally not setting status
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status for ') }
+ end
+
+ context 'with Faraday::Env with direct method and url properties' do
+ let(:exception) { Faraday::Env.new }
+
+ before do
+ exception.status = 404
+ exception.method = :get
+ exception.url = URI('http://example.com/test')
+ exception[:body] = 'not found'
+ end
+
+ it { expect(subject.wrapped_exception).to be_nil }
+ it { expect(subject.response).to eq(exception) }
+ it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
spec/faraday/response/logger_spec.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:51.861963561 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/response/logger_spec.rb 2026-02-09 22:17:51.882963600 +0000
@@ -23,0 +24 @@
+ stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
@@ -238,0 +240,5 @@
+ end
+
+ it 'converts to UTF-8' do
+ conn.get '/8bit'
+ expect(string_io.string).to match(%(caf��!))
spec/faraday/response/raise_error_spec.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:51.861963561 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb 2026-02-09 22:17:51.882963600 +0000
@@ -16 +16 @@
- stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
+ stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
@@ -31 +31 @@
- expect(ex.message).to eq('the server responded with status 400')
+ expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
@@ -42 +42 @@
- expect(ex.message).to eq('the server responded with status 401')
+ expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
@@ -53 +53 @@
- expect(ex.message).to eq('the server responded with status 403')
+ expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
@@ -64 +64 @@
- expect(ex.message).to eq('the server responded with status 404')
+ expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
@@ -86 +86 @@
- expect(ex.message).to eq('the server responded with status 408')
+ expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
@@ -97 +97 @@
- expect(ex.message).to eq('the server responded with status 409')
+ expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
@@ -106,3 +106,14 @@
- it 'raises Faraday::UnprocessableEntityError for 422 responses' do
- expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
- expect(ex.message).to eq('the server responded with status 422')
+ it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
+ expect(ex.response[:headers]['X-Reason']).to eq('because')
+ expect(ex.response[:status]).to eq(422)
+ expect(ex.response_status).to eq(422)
+ expect(ex.response_body).to eq('keep looking')
+ expect(ex.response_headers['X-Reason']).to eq('because')
+ end
+ end
+
+ it 'raises Faraday::UnprocessableContentError for 422 responses' do
+ expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
+ expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
@@ -119 +130 @@
- expect(ex.message).to eq('the server responded with status 429')
+ expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
@@ -141 +152 @@
- expect(ex.message).to eq('the server responded with status 499')
+ expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
@@ -152 +163 @@
- expect(ex.message).to eq('the server responded with status 500')
+ expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
spec/faraday/response_spec.rb
--- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/response_spec.rb 2026-02-09 22:17:51.861963561 +0000
+++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/response_spec.rb 2026-02-09 22:17:51.882963600 +0000
@@ -15,0 +16 @@
+ it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
@@ -33,0 +35,6 @@
+
+ context 'when response is not finished' do
+ subject { Faraday::Response.new.to_hash }
+
+ it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
+ end |
Contributor
gem compare --diff faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb
--- /tmp/d20260209-960-q1e9rc/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb 2026-02-09 22:17:54.128298516 +0000
+++ /tmp/d20260209-960-q1e9rc/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb 2026-02-09 22:17:54.128298516 +0000
@@ -5 +5 @@
- VERSION = '3.4.1'
+ VERSION = '3.4.2' |
Contributor
gem compare --diff faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb
--- /tmp/d20260209-963-kwskz7/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb 2026-02-09 22:18:00.431002328 +0000
+++ /tmp/d20260209-963-kwskz7/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb 2026-02-09 22:18:00.432002339 +0000
@@ -5 +5 @@
- VERSION = '3.4.1'
+ VERSION = '3.4.2' |
Contributor
gem compare faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT metadata:
3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
DIFFERENT version:
3.4.1: 3.4.1
3.4.2: 3.4.2
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb +1/-1
DIFFERENT runtime dependencies:
3.4.1->3.4.2:
* Updated:
net-http from: [">= 0.5.0"] to: ["~> 0.5"] |
2 similar comments
Contributor
gem compare faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT metadata:
3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
DIFFERENT version:
3.4.1: 3.4.1
3.4.2: 3.4.2
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb +1/-1
DIFFERENT runtime dependencies:
3.4.1->3.4.2:
* Updated:
net-http from: [">= 0.5.0"] to: ["~> 0.5"] |
Contributor
gem compare faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT metadata:
3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
DIFFERENT version:
3.4.1: 3.4.1
3.4.2: 3.4.2
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb +1/-1
DIFFERENT runtime dependencies:
3.4.1->3.4.2:
* Updated:
net-http from: [">= 0.5.0"] to: ["~> 0.5"] |
Contributor
gem compare json 2.13.2 2.18.1Compared versions: ["2.13.2", "2.18.1"]
DIFFERENT date:
2.13.2: 2025-07-28 00:00:00 UTC
2.18.1: 1980-01-02 00:00:00 UTC
DIFFERENT require_paths:
2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
DIFFERENT rubygems_version:
2.13.2: 3.6.2
2.18.1: 4.1.0.dev
DIFFERENT version:
2.13.2: 2.13.2
2.18.1: 2.18.1
DIFFERENT files:
2.13.2->2.18.1:
* Added:
ext/json/ext/json.h +101/-0
ext/json/ext/vendor/ryu.h +819/-0
lib/json/add/string.rb +35/-0
* Changed:
CHANGES.md +81/-8
LEGAL +12/-0
README.md +19/-1
ext/json/ext/fbuffer/fbuffer.h +35/-56
ext/json/ext/generator/extconf.rb +1/-1
ext/json/ext/generator/generator.c +326/-264
ext/json/ext/parser/extconf.rb +2/-1
ext/json/ext/parser/parser.c +565/-445
ext/json/ext/simd/simd.h +42/-12
ext/json/ext/vendor/fpconv.c +13/-12
lib/json.rb +44/-1
lib/json/add/core.rb +1/-0
lib/json/common.rb +60/-23
lib/json/ext/generator/state.rb +11/-14
lib/json/generic_object.rb +0/-8
lib/json/truffle_ruby/generator.rb +113/-63
lib/json/version.rb +1/-1
DIFFERENT extra_rdoc_files:
2.13.2->2.18.1:
* Changed:
README.md +19/-1 |
Contributor
gem compare --diff faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb
--- /tmp/d20260209-960-eaiyzg/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb 2026-02-09 22:18:12.369909474 +0000
+++ /tmp/d20260209-960-eaiyzg/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb 2026-02-09 22:18:12.370909474 +0000
@@ -5 +5 @@
- VERSION = '3.4.1'
+ VERSION = '3.4.2' |
Contributor
gem compare --diff faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb
--- /tmp/d20260209-986-d677ud/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb 2026-02-09 22:18:15.571202812 +0000
+++ /tmp/d20260209-986-d677ud/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb 2026-02-09 22:18:15.572202817 +0000
@@ -5 +5 @@
- VERSION = '3.4.1'
+ VERSION = '3.4.2' |
Contributor
gem compare --diff faraday-net_http 3.4.1 3.4.2Compared versions: ["3.4.1", "3.4.2"]
DIFFERENT files:
3.4.1->3.4.2:
* Changed:
lib/faraday/net_http/version.rb
--- /tmp/d20260209-977-je1dos/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb 2026-02-09 22:18:17.862011322 +0000
+++ /tmp/d20260209-977-je1dos/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb 2026-02-09 22:18:17.863011324 +0000
@@ -5 +5 @@
- VERSION = '3.4.1'
+ VERSION = '3.4.2' |
Contributor
|
Contributor
gem compare json 2.13.2 2.18.1Compared versions: ["2.13.2", "2.18.1"]
DIFFERENT date:
2.13.2: 2025-07-28 00:00:00 UTC
2.18.1: 1980-01-02 00:00:00 UTC
DIFFERENT require_paths:
2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
DIFFERENT rubygems_version:
2.13.2: 3.6.2
2.18.1: 4.1.0.dev
DIFFERENT version:
2.13.2: 2.13.2
2.18.1: 2.18.1
DIFFERENT files:
2.13.2->2.18.1:
* Added:
ext/json/ext/json.h +101/-0
ext/json/ext/vendor/ryu.h +819/-0
lib/json/add/string.rb +35/-0
* Changed:
CHANGES.md +81/-8
LEGAL +12/-0
README.md +19/-1
ext/json/ext/fbuffer/fbuffer.h +35/-56
ext/json/ext/generator/extconf.rb +1/-1
ext/json/ext/generator/generator.c +326/-264
ext/json/ext/parser/extconf.rb +2/-1
ext/json/ext/parser/parser.c +565/-445
ext/json/ext/simd/simd.h +42/-12
ext/json/ext/vendor/fpconv.c +13/-12
lib/json.rb +44/-1
lib/json/add/core.rb +1/-0
lib/json/common.rb +60/-23
lib/json/ext/generator/state.rb +11/-14
lib/json/generic_object.rb +0/-8
lib/json/truffle_ruby/generator.rb +113/-63
lib/json/version.rb +1/-1
DIFFERENT extra_rdoc_files:
2.13.2->2.18.1:
* Changed:
README.md +19/-1 |
2 similar comments
Contributor
gem compare json 2.13.2 2.18.1Compared versions: ["2.13.2", "2.18.1"]
DIFFERENT date:
2.13.2: 2025-07-28 00:00:00 UTC
2.18.1: 1980-01-02 00:00:00 UTC
DIFFERENT require_paths:
2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
DIFFERENT rubygems_version:
2.13.2: 3.6.2
2.18.1: 4.1.0.dev
DIFFERENT version:
2.13.2: 2.13.2
2.18.1: 2.18.1
DIFFERENT files:
2.13.2->2.18.1:
* Added:
ext/json/ext/json.h +101/-0
ext/json/ext/vendor/ryu.h +819/-0
lib/json/add/string.rb +35/-0
* Changed:
CHANGES.md +81/-8
LEGAL +12/-0
README.md +19/-1
ext/json/ext/fbuffer/fbuffer.h +35/-56
ext/json/ext/generator/extconf.rb +1/-1
ext/json/ext/generator/generator.c +326/-264
ext/json/ext/parser/extconf.rb +2/-1
ext/json/ext/parser/parser.c +565/-445
ext/json/ext/simd/simd.h +42/-12
ext/json/ext/vendor/fpconv.c +13/-12
lib/json.rb +44/-1
lib/json/add/core.rb +1/-0
lib/json/common.rb +60/-23
lib/json/ext/generator/state.rb +11/-14
lib/json/generic_object.rb +0/-8
lib/json/truffle_ruby/generator.rb +113/-63
lib/json/version.rb +1/-1
DIFFERENT extra_rdoc_files:
2.13.2->2.18.1:
* Changed:
README.md +19/-1 |
Contributor
gem compare json 2.13.2 2.18.1Compared versions: ["2.13.2", "2.18.1"]
DIFFERENT date:
2.13.2: 2025-07-28 00:00:00 UTC
2.18.1: 1980-01-02 00:00:00 UTC
DIFFERENT require_paths:
2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
DIFFERENT rubygems_version:
2.13.2: 3.6.2
2.18.1: 4.1.0.dev
DIFFERENT version:
2.13.2: 2.13.2
2.18.1: 2.18.1
DIFFERENT files:
2.13.2->2.18.1:
* Added:
ext/json/ext/json.h +101/-0
ext/json/ext/vendor/ryu.h +819/-0
lib/json/add/string.rb +35/-0
* Changed:
CHANGES.md +81/-8
LEGAL +12/-0
README.md +19/-1
ext/json/ext/fbuffer/fbuffer.h +35/-56
ext/json/ext/generator/extconf.rb +1/-1
ext/json/ext/generator/generator.c +326/-264
ext/json/ext/parser/extconf.rb +2/-1
ext/json/ext/parser/parser.c +565/-445
ext/json/ext/simd/simd.h +42/-12
ext/json/ext/vendor/fpconv.c +13/-12
lib/json.rb +44/-1
lib/json/add/core.rb +1/-0
lib/json/common.rb +60/-23
lib/json/ext/generator/state.rb +11/-14
lib/json/generic_object.rb +0/-8
lib/json/truffle_ruby/generator.rb +113/-63
lib/json/version.rb +1/-1
DIFFERENT extra_rdoc_files:
2.13.2->2.18.1:
* Changed:
README.md +19/-1 |
Contributor
|
2 similar comments
Contributor
|
Contributor
|
Contributor
gem compare json 2.13.2 2.18.1Compared versions: ["2.13.2", "2.18.1"]
DIFFERENT date:
2.13.2: 2025-07-28 00:00:00 UTC
2.18.1: 1980-01-02 00:00:00 UTC
DIFFERENT require_paths:
2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
DIFFERENT rubygems_version:
2.13.2: 3.6.2
2.18.1: 4.1.0.dev
DIFFERENT version:
2.13.2: 2.13.2
2.18.1: 2.18.1
DIFFERENT files:
2.13.2->2.18.1:
* Added:
ext/json/ext/json.h +101/-0
ext/json/ext/vendor/ryu.h +819/-0
lib/json/add/string.rb +35/-0
* Changed:
CHANGES.md +81/-8
LEGAL +12/-0
README.md +19/-1
ext/json/ext/fbuffer/fbuffer.h +35/-56
ext/json/ext/generator/extconf.rb +1/-1
ext/json/ext/generator/generator.c +326/-264
ext/json/ext/parser/extconf.rb +2/-1
ext/json/ext/parser/parser.c +565/-445
ext/json/ext/simd/simd.h +42/-12
ext/json/ext/vendor/fpconv.c +13/-12
lib/json.rb +44/-1
lib/json/add/core.rb +1/-0
lib/json/common.rb +60/-23
lib/json/ext/generator/state.rb +11/-14
lib/json/generic_object.rb +0/-8
lib/json/truffle_ruby/generator.rb +113/-63
lib/json/version.rb +1/-1
DIFFERENT extra_rdoc_files:
2.13.2->2.18.1:
* Changed:
README.md +19/-1 |
Contributor
|
9591d96 to
2287810
Compare
Bumps [faraday](https://github.com/lostisland/faraday) from 2.13.1 to 2.14.1. - [Release notes](https://github.com/lostisland/faraday/releases) - [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md) - [Commits](lostisland/faraday@v2.13.1...v2.14.1) --- updated-dependencies: - dependency-name: faraday dependency-version: 2.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com>
2287810 to
930ce5c
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps faraday from 2.13.1 to 2.14.1.
Release notes
Sourced from faraday's releases.
... (truncated)
Commits
16cbd38Version bump to 2.14.1a6d3a3aMerge commit from forkb23f710Explicit top-level namespace reference (#1657)49ba4acBump actions/checkout from 5 to 6 (#1655)51a49bcEnsure Claude reads the guidelines and allow to plan in a gitignored .ai/PLAN...894f65cAdd RFC document for Options architecture refactoring plan (#1644)397e3deAdd comprehensive AI agent guidelines for Claude, Cursor, and GitHub Copilot ...d98c65cUpdate Faraday-specific AI agent guidelines56c18ecAdd AI agent guidelines specific to Faraday repository3201a42Version bump to 2.14.0Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)You can disable automated security fix PRs for this repo from the Security Alerts page.