diff --git a/emailage.gemspec b/emailage.gemspec index afab9cb..e5f1e2a 100644 --- a/emailage.gemspec +++ b/emailage.gemspec @@ -26,6 +26,5 @@ Gem::Specification.new do |spec| spec.add_development_dependency "redcarpet", "~> 3.3" spec.add_dependency "typhoeus", "~> 1.0" - spec.add_dependency "uuid", "~> 2.3" spec.add_dependency "json", "~> 2.3" end diff --git a/lib/emailage/client.rb b/lib/emailage/client.rb index b3f9839..f975c89 100644 --- a/lib/emailage/client.rb +++ b/lib/emailage/client.rb @@ -1,5 +1,5 @@ require 'typhoeus' -require 'uuid' +require 'securerandom' require 'json' module Emailage @@ -7,6 +7,9 @@ class Client attr_reader :secret, :token, :hmac_key, :sandbox attr_accessor :raise_errors + class EmailageError < StandardError; end + class TemporaryError < EmailageError; end + # @param secret [String] Consumer secret, e.g. SID or API key. # @param token [String] Consumer OAuth token. # @param sandbox [Boolean] Whether to use a sandbox instead of a production server. @@ -38,16 +41,19 @@ def request(endpoint, params) params = { :format => 'json', :oauth_consumer_key => @secret, - :oauth_nonce => UUID.new.generate, + :oauth_nonce => SecureRandom.uuid, :oauth_signature_method => 'HMAC-SHA1', :oauth_timestamp => Time.now.to_i, :oauth_version => 1.0 }.merge(params) res = Typhoeus.get url, :params => params.merge(:oauth_signature => Signature.create('GET', url, params, @hmac_key)) - json = res.body.sub(/^[^{]+/, '') - JSON.parse json + if res.code == 200 + return JSON.parse json + elsif json.empty? + raise TemporaryError + end end public diff --git a/spec/client_spec.rb b/spec/client_spec.rb index d469b86..b6f04f0 100644 --- a/spec/client_spec.rb +++ b/spec/client_spec.rb @@ -4,9 +4,10 @@ let(:t) {spy :typhoeus} let(:email) {'test+emailage@example.com'} let(:ip) {'1.234.56.7'} - + let(:response) { double :response, :body => "\xEF\xBB\xBF{\"success\":[true]}", :code => 200 } + before { - allow(t).to receive(:get) {double :response, :body => "\xEF\xBB\xBF{\"success\":[true]}"} + allow(t).to receive(:get) { response } stub_const 'Typhoeus', t } @@ -33,6 +34,14 @@ it 'parses response body as JSON' do expect(request).to eq 'success' => [true] end + + context 'empty string returned' do + let(:response) { double :response, :body => "", :code => 503 } + + it 'raises TemporaryError' do + expect { request }.to raise_error(described_class::TemporaryError) + end + end end describe '#query' do