From b796163075ceaabe2115889fb77c1c7184ddd431 Mon Sep 17 00:00:00 2001 From: Jeff Bozek Date: Tue, 22 Mar 2011 13:42:06 -0500 Subject: [PATCH 1/4] quick tweak to see if recovering from failed referral endpoint connection can work. --- lib/whois/server/adapters/verisign.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/whois/server/adapters/verisign.rb b/lib/whois/server/adapters/verisign.rb index 36deb3d7b..9dff8db9e 100644 --- a/lib/whois/server/adapters/verisign.rb +++ b/lib/whois/server/adapters/verisign.rb @@ -38,8 +38,12 @@ def request(string) buffer_append response, host if endpoint = extract_referral(response) - response = query_the_socket(string, endpoint, DEFAULT_WHOIS_PORT) - buffer_append response, endpoint + begin + response = query_the_socket(string, endpoint, DEFAULT_WHOIS_PORT) + buffer_append response, endpoint + rescue ConnectionError => error + puts 'rescued.' + end end end From 1279d15b4bbab188e90bb80f0f0cbd32e04c6838 Mon Sep 17 00:00:00 2001 From: Jeff Bozek Date: Tue, 22 Mar 2011 14:07:25 -0500 Subject: [PATCH 2/4] allowed for configuration of incomplete response handling via client settings hash. --- lib/whois/errors.rb | 5 ++++- lib/whois/server/adapters/verisign.rb | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/whois/errors.rb b/lib/whois/errors.rb index 7346b1aae..beec7aad7 100644 --- a/lib/whois/errors.rb +++ b/lib/whois/errors.rb @@ -23,7 +23,10 @@ class ConnectionError < Error # Generic class for server errors. class ServerError < Error end - + + # Raised when the referral endpoint does not respond. + class IncompleteResponse < ServerError + end # Raised when the class hasn't been able to select a valid server # probably because definitions are outdated. diff --git a/lib/whois/server/adapters/verisign.rb b/lib/whois/server/adapters/verisign.rb index 9dff8db9e..148e2b3ee 100644 --- a/lib/whois/server/adapters/verisign.rb +++ b/lib/whois/server/adapters/verisign.rb @@ -42,7 +42,7 @@ def request(string) response = query_the_socket(string, endpoint, DEFAULT_WHOIS_PORT) buffer_append response, endpoint rescue ConnectionError => error - puts 'rescued.' + raise IncompleteResponse, "#{error.class}: #{error.message}" unless options[:allow_incomplete_responses] end end end From 0f2b6623d78201ab0e4ed70c534525957c2f3a10 Mon Sep 17 00:00:00 2001 From: Jeff Bozek Date: Tue, 22 Mar 2011 18:26:38 -0500 Subject: [PATCH 3/4] refactored incomplete response handling code and moved it to base instead of verisign. --- lib/whois/server/adapters/base.rb | 6 +++++- lib/whois/server/adapters/verisign.rb | 8 ++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/whois/server/adapters/base.rb b/lib/whois/server/adapters/base.rb index e992654a6..e259ee29d 100644 --- a/lib/whois/server/adapters/base.rb +++ b/lib/whois/server/adapters/base.rb @@ -162,7 +162,11 @@ def query_the_socket(query, host, port = nil) options[:bind_port] ) rescue *RESCUABLE_CONNECTION_ERRORS => error - raise ConnectionError, "#{error.class}: #{error.message}" + if error.instance_of? Errno::ECONNRESET + raise IncompleteResponse, "#{error.class}: #{error.message}" unless options[:allow_incomplete_responses] + else + raise ConnectionError, "#{error.class}: #{error.message}" + end end # This method handles the lowest connection diff --git a/lib/whois/server/adapters/verisign.rb b/lib/whois/server/adapters/verisign.rb index 148e2b3ee..36deb3d7b 100644 --- a/lib/whois/server/adapters/verisign.rb +++ b/lib/whois/server/adapters/verisign.rb @@ -38,12 +38,8 @@ def request(string) buffer_append response, host if endpoint = extract_referral(response) - begin - response = query_the_socket(string, endpoint, DEFAULT_WHOIS_PORT) - buffer_append response, endpoint - rescue ConnectionError => error - raise IncompleteResponse, "#{error.class}: #{error.message}" unless options[:allow_incomplete_responses] - end + response = query_the_socket(string, endpoint, DEFAULT_WHOIS_PORT) + buffer_append response, endpoint end end From aa16f66c9dca556b7db131b68b0b99d435bc43d8 Mon Sep 17 00:00:00 2001 From: Jeff Bozek Date: Tue, 22 Mar 2011 18:47:22 -0500 Subject: [PATCH 4/4] added appropriate tests. --- spec/whois/server/adapters/base_spec.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/spec/whois/server/adapters/base_spec.rb b/spec/whois/server/adapters/base_spec.rb index 26d1f79f6..751c73b45 100644 --- a/spec/whois/server/adapters/base_spec.rb +++ b/spec/whois/server/adapters/base_spec.rb @@ -4,6 +4,7 @@ before(:each) do @definition = [:tld, ".test", "whois.test", { :foo => "bar" }] + @allow_incomplete_responses_definition = [:tld, ".test", "whois.test", { :foo => "bar", :allow_incomplete_responses => true} ] end @@ -107,7 +108,7 @@ end describe "#query_the_socket" do - [ Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, SocketError ].each do |error| + [ Errno::EHOSTUNREACH, Errno::ECONNREFUSED, SocketError ].each do |error| it "re-raises #{error} as Whois::ConnectionError" do klass.any_instance.expects(:ask_the_socket).raises(error) expect { @@ -115,6 +116,20 @@ }.to raise_error(Whois::ConnectionError, "#{error}: #{error.new.message}") end end + + it "re-raises Errno::ECONNRESET as Whois::IncompleteResponse when allow_incomplete_responses is not true" do + klass.any_instance.expects(:ask_the_socket).raises(Errno::ECONNRESET) + expect { + klass.new(*@definition).send(:query_the_socket, "example.com", "whois.test") + }.to raise_error(Whois::IncompleteResponse, "#{Errno::ECONNRESET}: #{Errno::ECONNRESET.new.message}") + end + + it "raises no errors when Errno::ECONNRESET is raised an allow_incomplete_responses is true" do + klass.any_instance.expects(:ask_the_socket).raises(Errno::ECONNRESET) + expect { + klass.new(*@allow_incomplete_responses_definition).send(:query_the_socket, "example.com", "whois.test") + }.should_not raise_error(Whois::IncompleteResponse, "#{Errno::ECONNRESET}: #{Errno::ECONNRESET.new.message}") + end end end