rubydns 0.6.6 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4fda39223a95e55c2076290f606afad961a2329
4
- data.tar.gz: 68c313608b3dfff428024fded19fc4ca09031417
3
+ metadata.gz: 027557f4aae547ca2ae32cc66c59909b6a6bee56
4
+ data.tar.gz: f19af2749cdff025edbf9b7d8e8e6546c4911377
5
5
  SHA512:
6
- metadata.gz: 446b2658fd2a6438881ca805f0a202ca34f3d3e7b56480751ee230d5dfa3ac93757dac0f51f69edbad6fbc9afc925b8fd11efd774696b63439b1d8b6bfa5c044
7
- data.tar.gz: 40fa8b55fc9351c2c7afba9791ea58632290f3c21871005729498e1058b01219cc45c3d638076599a203c453ffd2190a4facaeff7d495afbbea397964fd9603b
6
+ metadata.gz: bd783eaa39bb28ae521da7b20aaea97636e8c3dfe492864f0c299f7264d786407ecebce88d2e759c42c7e08aff448a914e1913243fafda6d9bf2bdf6489177e2
7
+ data.tar.gz: 932b3c6332d87ca10684b42d34cc37b7738730ddb489afd7b08df0f54606ef24560c772e7f30c316b40652d7483d7e3f0f15312cc0f4e68df7a9ba84783d1f14
@@ -39,11 +39,11 @@ module RubyDNS
39
39
  query = RubyDNS::decode_message(data)
40
40
 
41
41
  return server.process_query(query, options, &block)
42
- rescue
42
+ rescue => error
43
43
  server.logger.error "Error processing request!"
44
- server.logger.error "#{$!.class}: #{$!.message}"
44
+ server.logger.error "#{error.class}: #{error.message}"
45
45
 
46
- $!.backtrace.each { |at| server.logger.error at }
46
+ error.backtrace.each { |at| server.logger.error at }
47
47
 
48
48
  # Encoding may fail, so we need to handle this particular case:
49
49
  server_failure = Resolv::DNS::Message::new(query ? query.id : 0)
@@ -22,6 +22,8 @@ require 'eventmachine'
22
22
  require 'stringio'
23
23
  require 'resolv'
24
24
 
25
+ require 'base64'
26
+
25
27
  require 'rubydns/extensions/resolv'
26
28
 
27
29
  module RubyDNS
@@ -30,12 +32,32 @@ module RubyDNS
30
32
  # The DNS message container.
31
33
  Message = Resolv::DNS::Message
32
34
 
35
+ DecodeError = Resolv::DNS::DecodeError
36
+
37
+ @@dump_bad_message = nil
38
+
39
+ # Call this function with a path where bad messages will be saved. Any message that causes an exception to be thrown while decoding the binary will be saved in base64 for later inspection. The log file could grow quickly so be careful - not designed for long term use.
40
+ def self.log_bad_messages!(log_path)
41
+ bad_messages_log = Logger.new(log_path, 10, 1024*100)
42
+ bad_messages_log.level = Logger::DEBUG
43
+
44
+ @dump_bad_message = lambda do |error, data|
45
+ bad_messages_log.debug("Bad message: #{Base64.encode64(data)}")
46
+ RubyDNS.log_exception(bad_messages_log, error)
47
+ end
48
+ end
49
+
33
50
  def self.decode_message(data)
34
51
  if data.respond_to? :force_encoding
35
52
  data.force_encoding("BINARY")
36
53
  end
37
54
 
38
- # This may throw Resolv::DNS::DecodeError.
39
55
  Message.decode(data)
56
+ rescue => error
57
+ if @dump_bad_message
58
+ @dump_bad_message.call(StandardError.new("foo"), data)
59
+ end
60
+
61
+ raise
40
62
  end
41
63
  end
@@ -84,6 +84,8 @@ module RubyDNS
84
84
  end
85
85
 
86
86
  request.errback do |error|
87
+ # In the case of a timeout, error will be nil, so we make one up.
88
+
87
89
  yield error
88
90
  end
89
91
 
@@ -167,18 +169,24 @@ module RubyDNS
167
169
  end
168
170
 
169
171
  # Setting up the timeout...
170
- timeout(@timeout) do
171
- @logger.debug "[#{@message.id}] Request timed out!" if @logger
172
-
173
- finish_request!
174
-
175
- try_next_server!
176
- end
172
+ timeout(@timeout)
177
173
  else
178
174
  fail ResolutionFailure.new("No available servers responded to the request.")
179
175
  end
180
176
  end
181
177
 
178
+ def timeout seconds
179
+ cancel_timeout
180
+
181
+ @deferred_timeout = EventMachine::Timer.new(seconds) do
182
+ @logger.debug "[#{@message.id}] Request timed out!" if @logger
183
+
184
+ finish_request!
185
+
186
+ try_next_server!
187
+ end
188
+ end
189
+
182
190
  module UDPRequestHandler
183
191
  def self.open(host, port, request)
184
192
  # Open a datagram socket... EventMachine doesn't support connected datagram sockets, so we have to cheat a bit:
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module RubyDNS
22
- VERSION = "0.6.6"
22
+ VERSION = "0.6.7"
23
23
  end
@@ -36,7 +36,7 @@ class ResolverTest < Test::Unit::TestCase
36
36
 
37
37
  EventMachine::run do
38
38
  resolver.query('foobar.oriontransfer.org') do |response|
39
- assert_equal response.rcode, Resolv::DNS::RCode::NXDomain
39
+ assert_equal Resolv::DNS::RCode::NXDomain, response.rcode
40
40
  EventMachine::stop
41
41
  end
42
42
  end
@@ -41,7 +41,7 @@ class SlowServer < RExec::Daemon::Base
41
41
  transaction.defer!
42
42
 
43
43
  # No domain exists, after 5 seconds:
44
- EventMachine::Timer.new(2) do
44
+ EventMachine::Timer.new(5) do
45
45
  transaction.failure!(:NXDomain)
46
46
  end
47
47
  end
@@ -62,6 +62,28 @@ class SlowServerTest < Test::Unit::TestCase
62
62
  SlowServer.stop
63
63
  end
64
64
 
65
+ def test_timeout
66
+ start_time = Time.now
67
+ end_time = nil
68
+ got_response = false
69
+
70
+ # Because there are two servers, the total timeout is actually, 2 seconds
71
+ resolver = RubyDNS::Resolver.new(SlowServer::SERVER_PORTS, :timeout => 1)
72
+
73
+ EventMachine::run do
74
+ resolver.query("apple.com", IN::A) do |response|
75
+ end_time = Time.now
76
+
77
+ got_response = response
78
+
79
+ EventMachine::stop
80
+ end
81
+ end
82
+
83
+ assert (end_time - start_time) <= 2.5, "Response should fail within timeout period."
84
+ assert_equal RubyDNS::ResolutionFailure, got_response.class, "Response should be resolution failure."
85
+ end
86
+
65
87
  def test_slow_request
66
88
  start_time = Time.now
67
89
  end_time = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubydns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-08 00:00:00.000000000 Z
11
+ date: 2013-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rexec