diff --git a/lib/webmock/http_lib_adapters/http_rb/response.rb b/lib/webmock/http_lib_adapters/http_rb/response.rb index 7f7d1b10b..fc0d65bf3 100644 --- a/lib/webmock/http_lib_adapters/http_rb/response.rb +++ b/lib/webmock/http_lib_adapters/http_rb/response.rb @@ -10,13 +10,34 @@ def to_webmock webmock_response end - def self.from_webmock(webmock_response, request_signature = nil) - status = Status.new(webmock_response.status.first) - headers = webmock_response.headers || {} - body = Body.new Streamer.new webmock_response.body - uri = URI request_signature.uri.to_s if request_signature + class << self + def from_webmock(webmock_response, request_signature = nil) + status = Status.new(webmock_response.status.first) + headers = webmock_response.headers || {} + body = Body.new Streamer.new webmock_response.body + uri = normalize_uri(request_signature && request_signature.uri) - new(status, "1.1", headers, body, uri) + return new(status, "1.1", headers, body, uri) if HTTP::VERSION < "1.0.0" + + new({ + :status => status, + :version => "1.1", + :headers => headers, + :body => body, + :uri => uri + }) + end + + private + + def normalize_uri(uri) + return unless uri + + uri = URI.parse uri + uri.port = nil if uri.default_port && uri.port == uri.default_port + + uri + end end end end diff --git a/lib/webmock/http_lib_adapters/http_rb/webmock.rb b/lib/webmock/http_lib_adapters/http_rb/webmock.rb index 800407fa0..aa4f2a332 100644 --- a/lib/webmock/http_lib_adapters/http_rb/webmock.rb +++ b/lib/webmock/http_lib_adapters/http_rb/webmock.rb @@ -34,13 +34,18 @@ def replay return unless webmock_response - raise Errno::ETIMEDOUT if webmock_response.should_timeout + raise_timeout_error if webmock_response.should_timeout webmock_response.raise_error_if_any invoke_callbacks(webmock_response, :real_request => false) ::HTTP::Response.from_webmock webmock_response, request_signature end + def raise_timeout_error + raise Errno::ETIMEDOUT if HTTP::VERSION < "1.0.0" + raise HTTP::ConnectionError, "connection error: #{Errno::ETIMEDOUT.new}" + end + def perform return unless ::WebMock.net_connect_allowed?(request_signature.uri) response = @perform.call diff --git a/spec/acceptance/http_rb/http_rb_spec.rb b/spec/acceptance/http_rb/http_rb_spec.rb index b6e86da9d..413aebe62 100644 --- a/spec/acceptance/http_rb/http_rb_spec.rb +++ b/spec/acceptance/http_rb/http_rb_spec.rb @@ -48,12 +48,26 @@ end end - it "restores request uri on replayed response object" do - uri = Addressable::URI.parse "http://example.com/foo" + context "restored request uri on replayed response object" do + it "keeps non-default port" do + stub_request :get, "example.com:1234/foo" + response = HTTP.get "http://example.com:1234/foo" - stub_request :get, "example.com/foo" - response = HTTP.get uri + expect(response.uri.to_s).to eq "http://example.com:1234/foo" + end + + it "does not injects default port" do + stub_request :get, "example.com/foo" + response = HTTP.get "http://example.com/foo" + + expect(response.uri.to_s).to eq "http://example.com/foo" + end + + it "strips out default port even if it was explicitly given" do + stub_request :get, "example.com/foo" + response = HTTP.get "http://example.com:80/foo" - expect(response.uri.to_s).to eq uri.to_s + expect(response.uri.to_s).to eq "http://example.com/foo" + end end end diff --git a/spec/acceptance/http_rb/http_rb_spec_helper.rb b/spec/acceptance/http_rb/http_rb_spec_helper.rb index 174e21d58..7d00d9c17 100644 --- a/spec/acceptance/http_rb/http_rb_spec_helper.rb +++ b/spec/acceptance/http_rb/http_rb_spec_helper.rb @@ -13,11 +13,13 @@ def http_request(method, uri, options = {}) end def client_timeout_exception_class - Errno::ETIMEDOUT + return Errno::ETIMEDOUT if HTTP::VERSION < "1.0.0" + HTTP::ConnectionError end def connection_refused_exception_class - Errno::ECONNREFUSED + return Errno::ECONNREFUSED if HTTP::VERSION < "1.0.0" + HTTP::ConnectionError end def http_library