net-dns 0.9.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -16
  3. data/README.md +1 -1
  4. data/lib/net/dns/header.rb +48 -64
  5. data/lib/net/dns/names.rb +8 -10
  6. data/lib/net/dns/packet.rb +46 -53
  7. data/lib/net/dns/question.rb +5 -3
  8. data/lib/net/dns/resolver/socks.rb +5 -7
  9. data/lib/net/dns/resolver/timeouts.rb +3 -5
  10. data/lib/net/dns/resolver.rb +54 -69
  11. data/lib/net/dns/rr/a.rb +3 -4
  12. data/lib/net/dns/rr/aaaa.rb +3 -5
  13. data/lib/net/dns/rr/classes.rb +6 -8
  14. data/lib/net/dns/rr/cname.rb +3 -5
  15. data/lib/net/dns/rr/hinfo.rb +9 -13
  16. data/lib/net/dns/rr/mr.rb +3 -5
  17. data/lib/net/dns/rr/mx.rb +5 -7
  18. data/lib/net/dns/rr/ns.rb +3 -5
  19. data/lib/net/dns/rr/null.rb +3 -5
  20. data/lib/net/dns/rr/ptr.rb +3 -5
  21. data/lib/net/dns/rr/soa.rb +11 -7
  22. data/lib/net/dns/rr/srv.rb +5 -2
  23. data/lib/net/dns/rr/txt.rb +4 -6
  24. data/lib/net/dns/rr/types.rb +90 -79
  25. data/lib/net/dns/rr.rb +2 -2
  26. data/lib/net/dns/version.rb +1 -1
  27. data/lib/net/dns.rb +3 -1
  28. metadata +11 -104
  29. data/.gitignore +0 -8
  30. data/.rubocop.yml +0 -3
  31. data/.rubocop_defaults.yml +0 -364
  32. data/.rubocop_todo.yml +0 -207
  33. data/Gemfile +0 -8
  34. data/Rakefile +0 -38
  35. data/bin/console +0 -14
  36. data/lib/net/dns/core_ext.rb +0 -45
  37. data/net-dns.gemspec +0 -23
  38. data/spec/fixtures/resolv.conf +0 -4
  39. data/spec/spec_helper.rb +0 -14
  40. data/spec/unit/resolver/dns_timeout_spec.rb +0 -36
  41. data/spec/unit/resolver/tcp_timeout_spec.rb +0 -46
  42. data/spec/unit/resolver/udp_timeout_spec.rb +0 -46
  43. data/test/test_helper.rb +0 -13
  44. data/test/unit/header_test.rb +0 -164
  45. data/test/unit/names_test.rb +0 -21
  46. data/test/unit/packet_test.rb +0 -47
  47. data/test/unit/question_test.rb +0 -81
  48. data/test/unit/resolver_test.rb +0 -114
  49. data/test/unit/rr/a_test.rb +0 -106
  50. data/test/unit/rr/aaaa_test.rb +0 -102
  51. data/test/unit/rr/classes_test.rb +0 -83
  52. data/test/unit/rr/cname_test.rb +0 -90
  53. data/test/unit/rr/hinfo_test.rb +0 -111
  54. data/test/unit/rr/mr_test.rb +0 -99
  55. data/test/unit/rr/mx_test.rb +0 -106
  56. data/test/unit/rr/ns_test.rb +0 -80
  57. data/test/unit/rr/types_test.rb +0 -71
  58. data/test/unit/rr_test.rb +0 -127
@@ -16,7 +16,7 @@ require 'net/dns/resolver/timeouts'
16
16
  # Resolver("www.google.com") { |packet| puts packet.size + " bytes" }
17
17
  # # => 484 bytes
18
18
  #
19
- def Resolver(name, type = Net::DNS::A, cls = Net::DNS::IN, &block)
19
+ def Resolver(name, type = Net::DNS::A, cls = Net::DNS::IN)
20
20
  resolver = Net::DNS::Resolver.start(name, type, cls)
21
21
  if block_given?
22
22
  yield resolver
@@ -231,9 +231,9 @@ module Net
231
231
  # Net::DNS::Resolver Perl module.
232
232
  #
233
233
  def initialize(config = {})
234
- raise ArgumentError, "Expected `config' to be a Hash" unless config.is_a?(Hash)
234
+ config.is_a?(Hash) or
235
+ raise(ArgumentError, "Expected `config' to be a Hash")
235
236
 
236
- # config.downcase_keys!
237
237
  @config = Defaults.merge config
238
238
  @raw = false
239
239
 
@@ -402,12 +402,11 @@ module Net
402
402
  # The default is port 53.
403
403
  #
404
404
  def port=(num)
405
- if (0..65_535).cover? num
406
- @config[:port] = num
407
- @logger.info "Port number changed to #{num}"
408
- else
409
- raise ArgumentError, "Wrong port number #{num}"
410
- end
405
+ (0..65_535).cover?(num) or
406
+ raise(ArgumentError, "Wrong port number #{num}")
407
+
408
+ @config[:port] = num
409
+ @logger.info "Port number changed to #{num}"
411
410
  end
412
411
 
413
412
  # Get the value of the source port number.
@@ -431,15 +430,12 @@ module Net
431
430
  # underlaying layers.
432
431
  #
433
432
  def source_port=(num)
434
- unless root?
435
- raise ResolverPermissionError, "Are you root?"
436
- end
433
+ root? or
434
+ raise(ResolverPermissionError, "Are you root?")
435
+ (0..65_535).cover?(num) or
436
+ raise(ArgumentError, "Wrong port number #{num}")
437
437
 
438
- if (0..65_535).cover?(num)
439
- @config[:source_port] = num
440
- else
441
- raise ArgumentError, "Wrong port number #{num}"
442
- end
438
+ @config[:source_port] = num
443
439
  end
444
440
  alias srcport= source_port=
445
441
 
@@ -482,13 +478,12 @@ module Net
482
478
  # The default is 0.0.0.0, meaning any local address (chosen on routing needs).
483
479
  #
484
480
  def source_address=(addr)
485
- unless addr.respond_to? :to_s
486
- raise ArgumentError, "Wrong address argument #{addr}"
487
- end
481
+ addr.respond_to?(:to_s) or
482
+ raise(ArgumentError, "Wrong address argument #{addr}")
488
483
 
489
484
  begin
490
485
  port = rand(1024..65_023)
491
- @logger.warn "Try to determine state of source address #{addr} with port #{port}"
486
+ @logger.info "Try to determine state of source address #{addr} with port #{port}"
492
487
  a = TCPServer.new(addr.to_s, port)
493
488
  rescue SystemCallError => e
494
489
  case e.errno
@@ -527,12 +522,11 @@ module Net
527
522
 
528
523
  # Set the retrasmission interval in seconds. Default 5 seconds.
529
524
  def retry_interval=(num)
530
- if num > 0
531
- @config[:retry_interval] = num
532
- @logger.info "Retransmission interval changed to #{num} seconds"
533
- else
534
- raise ArgumentError, "Interval must be positive"
535
- end
525
+ num.positive? or
526
+ raise(ArgumentError, "Interval must be positive")
527
+
528
+ @config[:retry_interval] = num
529
+ @logger.info "Retransmission interval changed to #{num} seconds"
536
530
  end
537
531
  alias retrans= retry_interval=
538
532
 
@@ -547,12 +541,11 @@ module Net
547
541
  # Set the number of times the resolver will try a query.
548
542
  # Default 4 times.
549
543
  def retry_number=(num)
550
- if num.is_a?(Integer) && (num > 0)
551
- @config[:retry_number] = num
552
- @logger.info "Retrasmissions number changed to #{num}"
553
- else
554
- raise ArgumentError, "Retry value must be a positive integer"
555
- end
544
+ (num.is_a?(Integer) && (num > 0)) or
545
+ raise(ArgumentError, "Retry value must be a positive integer")
546
+
547
+ @config[:retry_number] = num
548
+ @logger.info "Retrasmissions number changed to #{num}"
556
549
  end
557
550
  alias_method('retry=', 'retry_number=')
558
551
 
@@ -778,7 +771,6 @@ module Net
778
771
  # the old one, which will then be impossibile to recover.
779
772
  #
780
773
  def log_file=(log)
781
- @logger.close
782
774
  @config[:log_file] = log
783
775
  @logger = Logger.new(@config[:log_file])
784
776
  @logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
@@ -802,12 +794,10 @@ module Net
802
794
  # Note that this will destroy the precedent logger.
803
795
  #
804
796
  def logger=(logger)
805
- if logger.is_a? Logger
806
- @logger.close
807
- @logger = logger
808
- else
809
- raise ArgumentError, "Argument must be an instance of Logger class"
810
- end
797
+ logger.is_a?(Logger) or
798
+ raise(ArgumentError, "Argument must be an instance of Logger class")
799
+
800
+ @logger = logger
811
801
  end
812
802
 
813
803
  # Set the log level for the built-in logging facility.
@@ -948,9 +938,8 @@ module Net
948
938
  # were any records in the answer section.
949
939
  #
950
940
  def query(argument, type = Net::DNS::A, cls = Net::DNS::IN)
951
- if @config[:nameservers].empty?
952
- raise Resolver::Error, "No nameservers specified!"
953
- end
941
+ !@config[:nameservers].empty? or
942
+ raise(Resolver::Error, "No nameservers specified!")
954
943
 
955
944
  method = :query_udp
956
945
  packet = if argument.is_a? Net::DNS::Packet
@@ -987,10 +976,10 @@ module Net
987
976
 
988
977
  if type == Net::DNS::AXFR
989
978
  if @raw
990
- @logger.warn "AXFR query, switching to TCP over RAW socket"
979
+ @logger.info "AXFR query, switching to TCP over RAW socket"
991
980
  method = :send_raw_tcp
992
981
  else
993
- @logger.warn "AXFR query, switching to TCP"
982
+ @logger.info "AXFR query, switching to TCP"
994
983
  method = :query_tcp
995
984
  end
996
985
  end
@@ -1085,14 +1074,14 @@ module Net
1085
1074
  if ENV['LOCALDOMAIN']
1086
1075
  self.domain = ENV['LOCALDOMAIN']
1087
1076
  end
1088
- if ENV['RES_OPTIONS']
1089
- ENV['RES_OPTIONS'].split(" ").each do |opt|
1090
- name, val = opt.split(":")
1091
- begin
1092
- eval("self.#{name} = #{val}")
1093
- rescue NoMethodError
1094
- raise ArgumentError, "Invalid ENV option #{name}"
1095
- end
1077
+ return unless ENV['RES_OPTIONS']
1078
+
1079
+ ENV['RES_OPTIONS'].split(" ").each do |opt|
1080
+ name, val = opt.split(":")
1081
+ begin
1082
+ eval("self.#{name} = #{val}")
1083
+ rescue NoMethodError
1084
+ raise ArgumentError, "Invalid ENV option #{name}"
1096
1085
  end
1097
1086
  end
1098
1087
  end
@@ -1136,12 +1125,11 @@ module Net
1136
1125
  packet
1137
1126
  end
1138
1127
 
1139
- def query_tcp(packet, packet_data)
1128
+ def query_tcp(_packet, packet_data)
1140
1129
  ans = nil
1141
1130
  length = [packet_data.size].pack("n")
1142
1131
 
1143
1132
  @config[:nameservers].each do |ns|
1144
- begin
1145
1133
  buffer = ""
1146
1134
  socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
1147
1135
  socket.bind(Socket.pack_sockaddr_in(@config[:source_port], @config[:source_address].to_s))
@@ -1153,12 +1141,12 @@ module Net
1153
1141
  @logger.info "Contacting nameserver #{ns} port #{@config[:port]}"
1154
1142
  socket.write(length + packet_data)
1155
1143
  ans = socket.recv(Net::DNS::INT16SZ)
1156
- len = ans.unpack("n")[0]
1144
+ len = ans.unpack1("n")
1157
1145
 
1158
1146
  @logger.info "Receiving #{len} bytes..."
1159
1147
 
1160
1148
  if len == 0
1161
- @logger.warn "Receiving 0 lenght packet from nameserver #{ns}, trying next."
1149
+ @logger.warn "Receiving 0 length packet from nameserver #{ns}, trying next."
1162
1150
  next
1163
1151
  end
1164
1152
 
@@ -1174,16 +1162,16 @@ module Net
1174
1162
  end
1175
1163
  end
1176
1164
  return [buffer, ["", @config[:port], ns.to_s, ns.to_s]]
1177
- rescue TimeoutError
1165
+ rescue Timeout::Error
1178
1166
  @logger.warn "Nameserver #{ns} not responding within TCP timeout, trying next one"
1179
1167
  next
1180
- ensure
1168
+ ensure
1181
1169
  socket.close
1182
- end
1183
1170
  end
1171
+ ans
1184
1172
  end
1185
1173
 
1186
- def query_udp(packet, packet_data)
1174
+ def query_udp(_packet, packet_data)
1187
1175
  socket4 = UDPSocket.new
1188
1176
  socket4.bind(@config[:source_address].to_s, @config[:source_port])
1189
1177
  socket6 = UDPSocket.new(Socket::AF_INET6)
@@ -1192,7 +1180,6 @@ module Net
1192
1180
  ans = nil
1193
1181
  response = ""
1194
1182
  @config[:nameservers].each do |ns|
1195
- begin
1196
1183
  @config[:udp_timeout].timeout do
1197
1184
  @logger.info "Contacting nameserver #{ns} port #{@config[:port]}"
1198
1185
  ans = if ns.ipv6?
@@ -1204,21 +1191,19 @@ module Net
1204
1191
  end
1205
1192
  end
1206
1193
  break if ans
1207
- rescue TimeoutError
1194
+ rescue Timeout::Error
1208
1195
  @logger.warn "Nameserver #{ns} not responding within UDP timeout, trying next one"
1209
1196
  next
1210
- end
1211
1197
  end
1212
1198
  ans
1213
1199
  end
1214
1200
 
1215
1201
  # FIXME: a ? method should never raise.
1216
1202
  def valid?(name)
1217
- if name =~ /[^-\w\.]/
1218
- raise ArgumentError, "Invalid domain name #{name}"
1219
- else
1220
- true
1221
- end
1203
+ name !~ /[^-\w\.\*]/ or
1204
+ raise(ArgumentError, "Invalid domain name #{name}")
1205
+
1206
+ true
1222
1207
  end
1223
1208
  end
1224
1209
  end
data/lib/net/dns/rr/a.rb CHANGED
@@ -84,10 +84,9 @@ module Net
84
84
  address = case input
85
85
  when IPAddr
86
86
  input
87
- when Integer # Address in numeric form
88
- tmp = [(input >> 24), (input >> 16) & 0xFF, (input >> 8) & 0xFF, input & 0xFF]
89
- tmp = tmp.collect(&:to_s).join(".")
90
- IPAddr.new(tmp)
87
+ # Address in numeric form
88
+ when Integer
89
+ IPAddr.new(input, Socket::AF_INET)
91
90
  when String
92
91
  IPAddr.new(input)
93
92
  else
@@ -38,11 +38,9 @@ module Net
38
38
  private
39
39
 
40
40
  def subclass_new_from_hash(options)
41
- if options.key?(:address)
42
- @address = check_address(options[:address])
43
- else
44
- raise ArgumentError, ":address field is mandatory"
45
- end
41
+ raise ArgumentError, ":address field is mandatory" unless options.key?(:address)
42
+
43
+ @address = check_address(options[:address])
46
44
  end
47
45
 
48
46
  def subclass_new_from_string(str)
@@ -34,9 +34,9 @@ module Net
34
34
  initialize_from_num(@@default)
35
35
  end
36
36
 
37
- if @str.nil? || @num.nil?
38
- raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
39
- end
37
+ return unless @str.nil? || @num.nil?
38
+
39
+ raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
40
40
  end
41
41
 
42
42
  # Returns the class in number format
@@ -67,11 +67,9 @@ module Net
67
67
  # Be able to control the default class to assign when
68
68
  # cls argument is +nil+. Default to +IN+
69
69
  def self.default=(str)
70
- if CLASSES[str]
71
- @@default = CLASSES[str]
72
- else
73
- raise ArgumentError, "Unknown class `#{str}'"
74
- end
70
+ raise ArgumentError, "Unknown class `#{str}'" unless CLASSES[str]
71
+
72
+ @@default = CLASSES[str]
75
73
  end
76
74
 
77
75
  # Returns whether <tt>cls</tt> is a valid RR class.
@@ -27,11 +27,9 @@ module Net # :nodoc:
27
27
  private
28
28
 
29
29
  def subclass_new_from_hash(options)
30
- if options.key?(:cname)
31
- @cname = check_name(options[:cname])
32
- else
33
- raise ArgumentError, ":cname field is mandatory"
34
- end
30
+ raise ArgumentError, ":cname field is mandatory" unless options.key?(:cname)
31
+
32
+ @cname = check_name(options[:cname])
35
33
  end
36
34
 
37
35
  def subclass_new_from_string(str)
@@ -40,12 +40,10 @@ module Net # :nodoc:
40
40
  private
41
41
 
42
42
  def subclass_new_from_hash(options)
43
- if options.key?(:cpu) && options.key?(:os)
44
- @cpu = options[:cpu]
45
- @os = options[:os]
46
- else
47
- raise ArgumentError, ":cpu and :os fields are mandatory"
48
- end
43
+ raise ArgumentError, ":cpu and :os fields are mandatory" unless options.key?(:cpu) && options.key?(:os)
44
+
45
+ @cpu = options[:cpu]
46
+ @os = options[:os]
49
47
  end
50
48
 
51
49
  def subclass_new_from_string(str)
@@ -53,12 +51,12 @@ module Net # :nodoc:
53
51
  end
54
52
 
55
53
  def subclass_new_from_binary(data, offset)
56
- len = data.unpack("@#{offset} C").first
54
+ len = data.unpack1("@#{offset} C")
57
55
  offset += 1
58
56
  @cpu = data[offset..(offset + len)]
59
57
  offset += len
60
58
 
61
- len = data.unpack("@#{offset} C").first
59
+ len = data.unpack1("@#{offset} C")
62
60
  offset += 1
63
61
  @os = data[offset..(offset + len)]
64
62
  offset += len
@@ -73,11 +71,9 @@ module Net # :nodoc:
73
71
  end
74
72
 
75
73
  def check_hinfo(input)
76
- if input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
77
- [Regexp.last_match(1), Regexp.last_match(2)]
78
- else
79
- raise ArgumentError, "Invalid HINFO Section `#{input}'"
80
- end
74
+ raise ArgumentError, "Invalid HINFO Section `#{input}'" unless input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
75
+
76
+ [Regexp.last_match(1), Regexp.last_match(2)]
81
77
  end
82
78
 
83
79
  def build_pack
data/lib/net/dns/rr/mr.rb CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  private
24
24
 
25
25
  def subclass_new_from_hash(options)
26
- if options.key?(:newname)
27
- @newname = check_name(options[:newname])
28
- else
29
- raise ArgumentError, ":newname field is mandatory"
30
- end
26
+ raise ArgumentError, ":newname field is mandatory" unless options.key?(:newname)
27
+
28
+ @newname = check_name(options[:newname])
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
data/lib/net/dns/rr/mx.rb CHANGED
@@ -32,12 +32,10 @@ module Net # :nodoc:
32
32
  private
33
33
 
34
34
  def subclass_new_from_hash(options)
35
- if options.key?(:preference) && options.key?(:exchange)
36
- @preference = options[:preference].to_i
37
- @exchange = options[:exchange]
38
- else
39
- raise ArgumentError, ":preference and :exchange fields are mandatory"
40
- end
35
+ raise ArgumentError, ":preference and :exchange fields are mandatory" unless options.key?(:preference) && options.key?(:exchange)
36
+
37
+ @preference = options[:preference].to_i
38
+ @exchange = options[:exchange]
41
39
  end
42
40
 
43
41
  def subclass_new_from_string(str)
@@ -45,7 +43,7 @@ module Net # :nodoc:
45
43
  end
46
44
 
47
45
  def subclass_new_from_binary(data, offset)
48
- @preference = data.unpack("@#{offset} n")[0]
46
+ @preference = data.unpack1("@#{offset} n")
49
47
  offset += 2
50
48
  @exchange, offset = dn_expand(data, offset)
51
49
  offset
data/lib/net/dns/rr/ns.rb CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  private
24
24
 
25
25
  def subclass_new_from_hash(options)
26
- if options.key?(:nsdname)
27
- @nsdname = check_name(options[:nsdname])
28
- else
29
- raise ArgumentError, ":nsdname field is mandatory"
30
- end
26
+ raise ArgumentError, ":nsdname field is mandatory" unless options.key?(:nsdname)
27
+
28
+ @nsdname = check_name(options[:nsdname])
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  end
24
24
 
25
25
  def subclass_new_from_hash(args)
26
- if args.key? :null
27
- @null = args[:null]
28
- else
29
- raise ArgumentError, ":null field is mandatory but missing"
30
- end
26
+ raise ArgumentError, ":null field is mandatory but missing" unless args.key? :null
27
+
28
+ @null = args[:null]
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
@@ -40,11 +40,9 @@ module Net
40
40
  end
41
41
 
42
42
  def subclass_new_from_hash(args)
43
- if args.key?(:ptrdname) || args.key?(:ptr)
44
- @ptrdname = args[:ptrdname]
45
- else
46
- raise ArgumentError, ":ptrdname or :ptr field is mandatory"
47
- end
43
+ raise ArgumentError, ":ptrdname or :ptr field is mandatory" unless args.key?(:ptrdname) || args.key?(:ptr)
44
+
45
+ @ptrdname = args[:ptrdname]
48
46
  end
49
47
 
50
48
  def subclass_new_from_string(str)
@@ -5,7 +5,13 @@ module Net # :nodoc:
5
5
  # RR type SOA
6
6
  #------------------------------------------------------------
7
7
  class SOA < RR
8
- attr_reader :mname, :rname, :serial, :refresh, :retry, :expire, :minimum
8
+ attr_reader :mname
9
+ attr_reader :rname
10
+ attr_reader :serial
11
+ attr_reader :refresh
12
+ attr_reader :retry
13
+ attr_reader :expire
14
+ attr_reader :minimum
9
15
 
10
16
  private
11
17
 
@@ -41,11 +47,9 @@ module Net # :nodoc:
41
47
  end
42
48
 
43
49
  def number?(num)
44
- if num.is_a?(Integer) && (num > 0)
45
- true
46
- else
47
- raise ArgumentError, "Wrong format field: #{num} not a number or less than zero"
48
- end
50
+ raise ArgumentError, "Wrong format field: #{num} not a number or less than zero" unless num.is_a?(Integer) && (num > 0)
51
+
52
+ true
49
53
  end
50
54
 
51
55
  def subclass_new_from_string(str)
@@ -61,7 +65,7 @@ module Net # :nodoc:
61
65
  @mname, offset = dn_expand(data, offset)
62
66
  @rname, offset = dn_expand(data, offset)
63
67
  @serial, @refresh, @retry, @expire, @minimum = data.unpack("@#{offset} N5")
64
- offset + 5 * Net::DNS::INT32SZ
68
+ offset + (5 * Net::DNS::INT32SZ)
65
69
  end
66
70
 
67
71
  private
@@ -5,7 +5,10 @@ module Net # :nodoc:
5
5
  # RR type SRV
6
6
  #------------------------------------------------------------
7
7
  class SRV < RR
8
- attr_reader :priority, :weight, :port, :host
8
+ attr_reader :priority
9
+ attr_reader :weight
10
+ attr_reader :port
11
+ attr_reader :host
9
12
 
10
13
  private
11
14
 
@@ -20,7 +23,7 @@ module Net # :nodoc:
20
23
 
21
24
  @host = []
22
25
  while offset < off_end
23
- len = data.unpack("@#{offset} C")[0]
26
+ len = data.unpack1("@#{offset} C")
24
27
  offset += 1
25
28
  str = data[offset..offset + len - 1]
26
29
  offset += len
@@ -23,11 +23,9 @@ module Net # :nodoc:
23
23
  end
24
24
 
25
25
  def subclass_new_from_hash(args)
26
- if args.key? :txt
27
- @txt = args[:txt].strip
28
- else
29
- raise ArgumentError, ":txt field is mandatory but missing"
30
- end
26
+ raise ArgumentError, ":txt field is mandatory but missing" unless args.key? :txt
27
+
28
+ @txt = args[:txt].strip
31
29
  end
32
30
 
33
31
  def subclass_new_from_string(str)
@@ -38,7 +36,7 @@ module Net # :nodoc:
38
36
  off_end = offset + @rdlength
39
37
  @txt = ""
40
38
  while offset < off_end
41
- len = data.unpack("@#{offset} C")[0]
39
+ len = data.unpack1("@#{offset} C")
42
40
  offset += 1
43
41
  str = data[offset..offset + len - 1]
44
42
  offset += len