mirror of
https://github.com/samsonjs/instapaper.git
synced 2026-04-27 14:57:44 +00:00
improved error handling on responses
This commit is contained in:
parent
8733b43acb
commit
6509837fc1
3 changed files with 46 additions and 2 deletions
|
|
@ -4,6 +4,7 @@ module Instapaper
|
||||||
# @return [Integer]
|
# @return [Integer]
|
||||||
attr_reader :code
|
attr_reader :code
|
||||||
|
|
||||||
|
ServiceUnavailableError = Class.new(self)
|
||||||
BookmarkError = Class.new(self)
|
BookmarkError = Class.new(self)
|
||||||
FolderError = Class.new(self)
|
FolderError = Class.new(self)
|
||||||
HighlightError = Class.new(self)
|
HighlightError = Class.new(self)
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,23 @@ module Instapaper
|
||||||
@headers = Instapaper::HTTP::Headers.new(@client, @request_method, @uri, @options).request_headers
|
@headers = Instapaper::HTTP::Headers.new(@client, @request_method, @uri, @options).request_headers
|
||||||
options_key = @request_method == :get ? :params : :form
|
options_key = @request_method == :get ? :params : :form
|
||||||
response = ::HTTP.with(@headers).public_send(@request_method, @uri.to_s, options_key => @options)
|
response = ::HTTP.with(@headers).public_send(@request_method, @uri.to_s, options_key => @options)
|
||||||
fail_if_error(parsed_response(response))
|
fail_if_error(response, raw)
|
||||||
|
fail_if_error_in_body(parsed_response(response))
|
||||||
raw ? response.to_s : parsed_response(response)
|
raw ? response.to_s : parsed_response(response)
|
||||||
end
|
end
|
||||||
|
|
||||||
def fail_if_error(response)
|
def fail_if_error(response, raw)
|
||||||
|
fail Instapaper::Error::ServiceUnavailableError if response.status != 200
|
||||||
|
return if raw
|
||||||
|
|
||||||
|
begin
|
||||||
|
response.parse
|
||||||
|
rescue JSON::ParserError
|
||||||
|
fail Instapaper::Error::ServiceUnavailableError
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def fail_if_error_in_body(response)
|
||||||
error = error(response)
|
error = error(response)
|
||||||
fail(error) if error
|
fail(error) if error
|
||||||
end
|
end
|
||||||
|
|
|
||||||
31
spec/instapaper/http/request_spec.rb
Normal file
31
spec/instapaper/http/request_spec.rb
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Instapaper::HTTP::Request do
|
||||||
|
let(:client) { Instapaper::Client.new(consumer_key: 'CK', consumer_secret: 'CS', oauth_token: 'OT', oauth_token_secret: 'OS') }
|
||||||
|
|
||||||
|
describe 'error handling' do
|
||||||
|
context 'when receiving a non-200 response' do
|
||||||
|
before do
|
||||||
|
stub_post('/api/1/folders/list')
|
||||||
|
.to_return(status: 503, body: '', headers: {content_type: 'application/json; charset=utf-8'})
|
||||||
|
end
|
||||||
|
it 'raises a ServiceUnavailableError' do
|
||||||
|
expect {
|
||||||
|
client.folders
|
||||||
|
}.to raise_error(Instapaper::Error::ServiceUnavailableError)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when failing to parse json' do
|
||||||
|
before do
|
||||||
|
stub_post('/api/1/folders/list')
|
||||||
|
.to_return(status: 200, body: '{"key":"value}', headers: {content_type: 'application/json; charset=utf-8'})
|
||||||
|
end
|
||||||
|
it 'raises a ServiceUnavailableError' do
|
||||||
|
expect {
|
||||||
|
client.folders
|
||||||
|
}.to raise_error(Instapaper::Error::ServiceUnavailableError)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in a new issue