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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe06cb348414e96cabc7ad81a08d8c030d36d4f95cec538a2a1ca457123d6b58
4
- data.tar.gz: 76e5664c2582c7ebac250e7ae2c0680864ea85f4896eaca76b1f5050f517c934
3
+ metadata.gz: d4ffb8685eb3a47dad14219a9ffd0fcd4193c2ab24bb04ae4b213d10513adafc
4
+ data.tar.gz: 6d644f3e0ffc4654dda0e08d077f0f3bd463a7c6d3de05b2c43405e5f2a008b4
5
5
  SHA512:
6
- metadata.gz: d5770a6b12241696f5930240913a15740a6950b94d8be0e0b64a83bc8f86da75c6c26d044e754590a1b8915e5f997c134d07653eaa64ee2177147edefa5f33ef
7
- data.tar.gz: 34916a1a687ecf6fac55bf52a860529e29642043c5e8a35b44a9931ce37c6fc26edab43b6edc664eae5052649bbf133f92a24597f9b757a14feb81deb493c010
6
+ metadata.gz: 638a807a5dc8f368bfba9e4ad720625aa037e9432b23faed36f3d31674eecfc6c29a68a6b28f95a728db2cc0dbe11223f6ea7e4bc24e9478aaf9ba590dbb71b4
7
+ data.tar.gz: e2fd429f878abe021d95b256d1717ea0d6a38204602e1181bf4b63d935c26d935f03936c73c9f7c89586217ca8c352783d07714c17d5eec386f010fb2d6bd831
@@ -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
- input_data = StreamTransport.read_chunk(socket)
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
- @logger.debug "<#{response.id}> Wrote #{length} bytes via TCP..."
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
@@ -220,9 +220,11 @@ module Async::DNS
220
220
  end
221
221
 
222
222
  def try_stream_server(request, socket)
223
- StreamTransport.write_chunk(socket, request.packet)
223
+ transport = Transport.new(socket)
224
224
 
225
- input_data = StreamTransport.read_chunk(socket)
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
@@ -23,64 +23,40 @@ require 'ipaddr'
23
23
 
24
24
  require_relative 'message'
25
25
 
26
- module Async::DNS
27
- def self.address_family(host)
28
- return IPAddr.new(host).family
29
- end
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
- end
39
-
40
- module StreamTransport
41
- def self.read_chunk(socket)
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
- # Read in the length, the first two bytes:
55
- length = buffer.string.byteslice(0, 2).unpack('n')[0]
37
+ def write_message(message)
38
+ write_chunk(message.encode)
39
+ end
56
40
 
57
- # Read data until we have the amount specified:
58
- while (buffer.size - 2) < length
59
- required = (2 + length) - buffer.size
60
-
61
- # Read precisely the required amount:
62
- if data = socket.read(required)
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
- return buffer.string.byteslice(2, length)
70
- end
71
-
72
- def self.write_message(socket, message)
73
- write_chunk(socket, message.encode)
74
- end
75
-
76
- def self.write_chunk(socket, output_data)
77
- size_data = [output_data.bytesize].pack('n')
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
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module DNS
23
- VERSION = '1.2.1'
23
+ VERSION = '1.2.2'
24
24
  end
25
25
  end
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.1
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-01-21 00:00:00.000000000 Z
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.1
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.