From 49127aff8a0c46dbbe89d146b32f55c32f4fd923 Mon Sep 17 00:00:00 2001 From: Sam Harrison Date: Fri, 13 Sep 2019 16:23:43 -0500 Subject: [PATCH 1/2] Catch and wrap Faraday client errors --- lib/twilio-ruby/http/http_client.rb | 12 +++++++++--- spec/http/http_client_spec.rb | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/twilio-ruby/http/http_client.rb b/lib/twilio-ruby/http/http_client.rb index 7342236cc..fd003c3db 100644 --- a/lib/twilio-ruby/http/http_client.rb +++ b/lib/twilio-ruby/http/http_client.rb @@ -36,10 +36,8 @@ def _request(request) @last_request = request @last_response = nil - response = @connection.send(request.method.downcase.to_sym, - request.url, - request.method == 'GET' ? request.params : request.data) + response = send(request) if response.body && !response.body.empty? object = response.body elsif response.status == 400 @@ -52,6 +50,14 @@ def _request(request) twilio_response end + def send(request) + @connection.send(request.method.downcase.to_sym, + request.url, + request.method == 'GET' ? request.params : request.data) + rescue Faraday::ClientError => e + raise Twilio::REST::TwilioError, e + end + def request(host, port, method, url, params = {}, data = {}, headers = {}, auth = nil, timeout = nil) request = Twilio::Request.new(host, port, method, url, params, data, headers, auth, timeout) _request(request) diff --git a/spec/http/http_client_spec.rb b/spec/http/http_client_spec.rb index 6f9579ef7..1d1aa8dc1 100644 --- a/spec/http/http_client_spec.rb +++ b/spec/http/http_client_spec.rb @@ -96,7 +96,7 @@ expect(Faraday).to receive(:new).and_return(Faraday::Connection.new) allow_any_instance_of(Faraday::Connection).to receive(:send).and_raise(Faraday::ConnectionFailed.new('BOOM')) - expect { @client.request('host', 'port', 'GET', 'url', nil, nil, {}, ['a', 'b']) }.to raise_exception(Faraday::ConnectionFailed) + expect { @client.request('host', 'port', 'GET', 'url', nil, nil, {}, ['a', 'b']) }.to raise_exception(Twilio::REST::TwilioError) expect(@client.last_response).to be_nil expect(@client.last_request).to_not be_nil expect(@client.last_request.host).to eq('host') @@ -116,7 +116,7 @@ it 'previous last_response should be cleared' do expect(Faraday).to receive(:new).and_return(Faraday::Connection.new) allow_any_instance_of(Faraday::Connection).to receive(:send).and_raise(Faraday::ConnectionFailed.new('BOOM')) - expect { @client.request('host', 'port', 'GET', 'url', nil, nil, {}, ['a', 'b']) }.to raise_exception(Faraday::ConnectionFailed) + expect { @client.request('host', 'port', 'GET', 'url', nil, nil, {}, ['a', 'b']) }.to raise_exception(Twilio::REST::TwilioError) expect(@client.last_response).to be_nil end end From b251880c4be2299396e83100d076351552afb160 Mon Sep 17 00:00:00 2001 From: Sam Harrison Date: Mon, 16 Sep 2019 10:00:27 -0500 Subject: [PATCH 2/2] Update docs for API error handling --- README.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 80bbcf731..d4cb3a523 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' ### Make a Call ```ruby -@client.api.account.calls.create( +@client.calls.create( from: '+14159341234', to: '+16105557069', url: 'http://example.com' @@ -88,7 +88,7 @@ auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' ### Send an SMS ```ruby -@client.api.account.messages.create( +@client.messages.create( from: '+14159341234', to: '+16105557069', body: 'Hey there!' @@ -98,7 +98,7 @@ auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' ### List your SMS Messages ```ruby -@client.api.account.messages.list +@client.messages.list(limit: 20) ``` ### Fetch a single SMS message by Sid @@ -106,22 +106,30 @@ auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' ```ruby # put the message sid you want to retrieve here: message_sid = 'SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -@client.api.account.messages(message_sid).fetch +@client.messages(message_sid).fetch ``` ### Customizing your HTTP Client -twilio-ruby uses [Faraday][faraday] to make HTTP requests. You can tell -Twilio::REST::Client to use any of the Faraday adapters like so: +`twilio-ruby` uses [Faraday][faraday] to make HTTP requests. You can tell `Twilio::REST::Client` to use any of the Faraday adapters like so: ```ruby @client.http_client.adapter = :typhoeus ``` -## Getting Started With Client Capability Tokens +### Handling Errors -If you just need to generate a Capability Token for use with Twilio Client, you -can do this: +```ruby +begin + messages = @client.messages.list(limit: 20) +rescue Twilio::REST::TwilioError => e + puts e.message +end +``` + +### Getting Started With Client Capability Tokens + +If you just need to generate a Capability Token for use with Twilio Client, you can do this: ```ruby require 'twilio-ruby' @@ -145,8 +153,7 @@ capability.add_scope(incoming_scope) @token = capability.to_s ``` -There is a slightly more detailed document in the [Capability][capability] -section of the wiki. +There is a slightly more detailed document in the [Capability][capability] section of the wiki. ### Generating TwiML