diff --git a/lib/faraday/error.rb b/lib/faraday/error.rb index ea487fea9..fd58354db 100644 --- a/lib/faraday/error.rb +++ b/lib/faraday/error.rb @@ -61,6 +61,10 @@ class ResourceNotFound < ClientError class ProxyAuthError < ClientError end + # Raised by Faraday::Response::RaiseError in case of a 409 response. + class ConflictError < ClientError + end + # Raised by Faraday::Response::RaiseError in case of a 422 response. class UnprocessableEntityError < ClientError end diff --git a/lib/faraday/response/raise_error.rb b/lib/faraday/response/raise_error.rb index cb568607c..8a380fd40 100644 --- a/lib/faraday/response/raise_error.rb +++ b/lib/faraday/response/raise_error.rb @@ -24,6 +24,8 @@ def on_complete(env) # mimic the behavior that we get with proxy requests with HTTPS msg = %(407 "Proxy Authentication Required") raise Faraday::ProxyAuthError.new(msg, response_values(env)) + when 409 + raise Faraday::ConflictError, response_values(env) when 422 raise Faraday::UnprocessableEntityError, response_values(env) when ClientErrorStatuses diff --git a/spec/faraday/response/raise_error_spec.rb b/spec/faraday/response/raise_error_spec.rb index 8f0c53a02..c5f0c0c66 100644 --- a/spec/faraday/response/raise_error_spec.rb +++ b/spec/faraday/response/raise_error_spec.rb @@ -11,6 +11,7 @@ stub.get('forbidden') { [403, { 'X-Reason' => 'because' }, 'keep looking'] } stub.get('not-found') { [404, { 'X-Reason' => 'because' }, 'keep looking'] } stub.get('proxy-error') { [407, { 'X-Reason' => 'because' }, 'keep looking'] } + stub.get('conflict') { [409, { 'X-Reason' => 'because' }, 'keep looking'] } stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] } stub.get('4xx') { [499, { 'X-Reason' => 'because' }, 'keep looking'] } stub.get('server-error') { [500, { 'X-Error' => 'bailout' }, 'fail'] } @@ -57,6 +58,13 @@ end end + it 'raises Faraday::ConflictError for 409 responses' do + expect { conn.get('conflict') }.to raise_error(Faraday::ConflictError) do |ex| + expect(ex.message).to eq('the server responded with status 409') + expect(ex.response[:headers]['X-Reason']).to eq('because') + end + end + 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')