diff --git a/lib/http/connection.rb b/lib/http/connection.rb index 7daeed3d..42ff5c24 100644 --- a/lib/http/connection.rb +++ b/lib/http/connection.rb @@ -35,6 +35,9 @@ def initialize(req, options) send_proxy_connect_request(req) start_tls(req, options) reset_timer + + rescue SocketError, SystemCallError => ex + raise HTTP::Error.new(ex) end # @see (HTTP::Response::Parser#status_code) diff --git a/lib/http/errors.rb b/lib/http/errors.rb index 6fefd8ce..b6130da2 100644 --- a/lib/http/errors.rb +++ b/lib/http/errors.rb @@ -16,4 +16,7 @@ class TimeoutError < Error; end # Header name is invalid class InvalidHeaderNameError < Error; end + + # Something unexpected happened, probably a bug + class UnexpectedError < Error;end end diff --git a/lib/http/response/status.rb b/lib/http/response/status.rb index 85d605ca..80150c6f 100644 --- a/lib/http/response/status.rb +++ b/lib/http/response/status.rb @@ -111,6 +111,7 @@ def #{symbol}? # def bad_request? end def __setobj__(obj) + raise HTTP::UnexpectedError.new('expected object to respond_to #to_i') unless obj.respond_to?(:to_i) @code = obj.to_i end diff --git a/spec/lib/http/request/writer_spec.rb b/spec/lib/http/request/writer_spec.rb index 66c766ed..a90de13b 100644 --- a/spec/lib/http/request/writer_spec.rb +++ b/spec/lib/http/request/writer_spec.rb @@ -37,7 +37,7 @@ let(:body) { 123 } it "raises an error" do - expect { writer }.to raise_error + expect { writer }.to raise_error(HTTP::RequestError) end end end @@ -59,12 +59,12 @@ context "when Transfer-Encoding not set" do let(:headers) { HTTP::Headers.new } - specify { expect { writer.stream }.to raise_error } + specify { expect { writer.stream }.to raise_error(HTTP::RequestError) } end context "when Transfer-Encoding is not chunked" do let(:headers) { HTTP::Headers.coerce "Transfer-Encoding" => "gzip" } - specify { expect { writer.stream }.to raise_error } + specify { expect { writer.stream }.to raise_error(HTTP::RequestError) } end end diff --git a/spec/lib/http/response/status_spec.rb b/spec/lib/http/response/status_spec.rb index d1314a58..03969415 100644 --- a/spec/lib/http/response/status_spec.rb +++ b/spec/lib/http/response/status_spec.rb @@ -1,7 +1,7 @@ RSpec.describe HTTP::Response::Status do describe ".new" do it "fails if given value does not respond to #to_i" do - expect { described_class.new double }.to raise_error + expect { described_class.new double }.to raise_error(HTTP::UnexpectedError) end it "accepts any object that responds to #to_i" do diff --git a/spec/lib/http_spec.rb b/spec/lib/http_spec.rb index 3224d74a..cc52ca1f 100644 --- a/spec/lib/http_spec.rb +++ b/spec/lib/http_spec.rb @@ -337,5 +337,10 @@ client = HTTP.headers("Cookie" => "foo=bar").cookies(:baz => :moo) expect(client.get(endpoint).to_s).to eq "foo: bar\nbaz: moo" end + + it "throws correct error" do + expect { HTTP.get('http://thishostshouldnotexists.com') }.to raise_error(HTTP::Error) + expect { HTTP.get('http://127.0.0.1:000') }.to raise_error(HTTP::Error) + end end end