async-dns 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/async/dns/handler.rb +9 -6
- data/lib/async/dns/resolver.rb +4 -2
- data/lib/async/dns/transport.rb +27 -51
- data/lib/async/dns/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4ffb8685eb3a47dad14219a9ffd0fcd4193c2ab24bb04ae4b213d10513adafc
|
4
|
+
data.tar.gz: 6d644f3e0ffc4654dda0e08d077f0f3bd463a7c6d3de05b2c43405e5f2a008b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 638a807a5dc8f368bfba9e4ad720625aa037e9432b23faed36f3d31674eecfc6c29a68a6b28f95a728db2cc0dbe11223f6ea7e4bc24e9478aaf9ba590dbb71b4
|
7
|
+
data.tar.gz: e2fd429f878abe021d95b256d1717ea0d6a38204602e1181bf4b63d935c26d935f03936c73c9f7c89586217ca8c352783d07714c17d5eec386f010fb2d6bd831
|
data/lib/async/dns/handler.rb
CHANGED
@@ -18,6 +18,8 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
+
require 'async/io/stream'
|
22
|
+
|
21
23
|
require_relative 'transport'
|
22
24
|
|
23
25
|
module Async::DNS
|
@@ -114,13 +116,14 @@ module Async::DNS
|
|
114
116
|
end
|
115
117
|
|
116
118
|
def handle_connection(socket)
|
117
|
-
|
118
|
-
|
119
|
-
response = process_query(input_data, remote_address: socket.remote_address)
|
120
|
-
|
121
|
-
length = StreamTransport.write_message(socket, response)
|
119
|
+
transport = Transport.new(socket)
|
122
120
|
|
123
|
-
|
121
|
+
while input_data = transport.read_chunk
|
122
|
+
response = process_query(input_data, remote_address: socket.remote_address)
|
123
|
+
length = transport.write_message(response)
|
124
|
+
|
125
|
+
@logger.debug "<#{response.id}> Wrote #{length} bytes via TCP..."
|
126
|
+
end
|
124
127
|
rescue EOFError => error
|
125
128
|
@logger.warn "<> Error: TCP session ended prematurely!"
|
126
129
|
rescue Errno::ECONNRESET => error
|
data/lib/async/dns/resolver.rb
CHANGED
@@ -220,9 +220,11 @@ module Async::DNS
|
|
220
220
|
end
|
221
221
|
|
222
222
|
def try_stream_server(request, socket)
|
223
|
-
|
223
|
+
transport = Transport.new(socket)
|
224
224
|
|
225
|
-
|
225
|
+
transport.write_chunk(request.packet)
|
226
|
+
|
227
|
+
input_data = transport.read_chunk
|
226
228
|
|
227
229
|
return Async::DNS::decode_message(input_data)
|
228
230
|
end
|
data/lib/async/dns/transport.rb
CHANGED
@@ -23,64 +23,40 @@ require 'ipaddr'
|
|
23
23
|
|
24
24
|
require_relative 'message'
|
25
25
|
|
26
|
-
module Async
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
# A helper class for processing incoming network data.
|
32
|
-
class BinaryStringIO < StringIO
|
33
|
-
def initialize
|
34
|
-
super
|
35
|
-
|
36
|
-
set_encoding("BINARY")
|
26
|
+
module Async
|
27
|
+
module DNS
|
28
|
+
def self.address_family(host)
|
29
|
+
return IPAddr.new(host).family
|
37
30
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# The data buffer:
|
43
|
-
buffer = BinaryStringIO.new
|
44
|
-
|
45
|
-
# First we need to read in the length of the packet
|
46
|
-
while buffer.size < 2
|
47
|
-
if data = socket.read(1)
|
48
|
-
buffer.write data
|
49
|
-
else
|
50
|
-
raise EOFError, "Could not read message size!"
|
51
|
-
end
|
31
|
+
|
32
|
+
class Transport
|
33
|
+
def initialize(socket)
|
34
|
+
@stream = IO::Stream.new(socket)
|
52
35
|
end
|
53
36
|
|
54
|
-
|
55
|
-
|
37
|
+
def write_message(message)
|
38
|
+
write_chunk(message.encode)
|
39
|
+
end
|
56
40
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
buffer.write data
|
64
|
-
else
|
65
|
-
raise EOFError, "Could not read message data!"
|
41
|
+
def read_chunk
|
42
|
+
if size_data = @stream.read(2)
|
43
|
+
# Read in the length, the first two bytes:
|
44
|
+
size = size_data.unpack('n')[0]
|
45
|
+
|
46
|
+
return @stream.read(size)
|
66
47
|
end
|
67
48
|
end
|
68
49
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
# TODO: Validate/check for data written correctly
|
80
|
-
count = socket.write(size_data)
|
81
|
-
count = socket.write(output_data)
|
82
|
-
|
83
|
-
return output_data.bytesize
|
50
|
+
def write_chunk(output_data)
|
51
|
+
size_data = [output_data.bytesize].pack('n')
|
52
|
+
|
53
|
+
@stream.write(size_data)
|
54
|
+
@stream.write(output_data)
|
55
|
+
|
56
|
+
@stream.flush
|
57
|
+
|
58
|
+
return output_data.bytesize
|
59
|
+
end
|
84
60
|
end
|
85
61
|
end
|
86
62
|
end
|
data/lib/async/dns/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-dns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async-io
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
- !ruby/object:Gem::Version
|
165
165
|
version: '0'
|
166
166
|
requirements: []
|
167
|
-
rubygems_version: 3.0.
|
167
|
+
rubygems_version: 3.0.2
|
168
168
|
signing_key:
|
169
169
|
specification_version: 4
|
170
170
|
summary: An easy to use DNS client resolver and server for Ruby.
|