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 +4 -4
- data/lib/rubydns/handler.rb +3 -3
- data/lib/rubydns/message.rb +23 -1
- data/lib/rubydns/resolver.rb +15 -7
- data/lib/rubydns/version.rb +1 -1
- data/test/test_resolver.rb +1 -1
- data/test/test_slow_server.rb +23 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 027557f4aae547ca2ae32cc66c59909b6a6bee56
|
4
|
+
data.tar.gz: f19af2749cdff025edbf9b7d8e8e6546c4911377
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd783eaa39bb28ae521da7b20aaea97636e8c3dfe492864f0c299f7264d786407ecebce88d2e759c42c7e08aff448a914e1913243fafda6d9bf2bdf6489177e2
|
7
|
+
data.tar.gz: 932b3c6332d87ca10684b42d34cc37b7738730ddb489afd7b08df0f54606ef24560c772e7f30c316b40652d7483d7e3f0f15312cc0f4e68df7a9ba84783d1f14
|
data/lib/rubydns/handler.rb
CHANGED
@@ -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 "#{
|
44
|
+
server.logger.error "#{error.class}: #{error.message}"
|
45
45
|
|
46
|
-
|
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)
|
data/lib/rubydns/message.rb
CHANGED
@@ -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
|
data/lib/rubydns/resolver.rb
CHANGED
@@ -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)
|
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:
|
data/lib/rubydns/version.rb
CHANGED
data/test/test_resolver.rb
CHANGED
@@ -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
|
39
|
+
assert_equal Resolv::DNS::RCode::NXDomain, response.rcode
|
40
40
|
EventMachine::stop
|
41
41
|
end
|
42
42
|
end
|
data/test/test_slow_server.rb
CHANGED
@@ -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(
|
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.
|
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-
|
11
|
+
date: 2013-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rexec
|