Class: Resolv::DNS::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/net/dns/resolv.rb,
lib/net/dns/resolvx.rb

Overview

:nodoc:

Defined Under Namespace

Classes: MessageDecoder, MessageEncoder

Constant Summary collapse

@@identifier =
-1

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id = (@@identifier += 1) & 0xffff) ⇒ Message

Returns a new instance of Message.



1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
# File 'lib/net/dns/resolv.rb', line 1130

def initialize(id = (@@identifier += 1) & 0xffff)
  @id = id
  @qr = 0
  @opcode = 0
  @aa = 0
  @tc = 0
  @rd = 0 # recursion desired
  @ra = 0 # recursion available
  @rcode = 0
  @question = []
  @answer = []
  @authority = []
  @additional = []
end

Instance Attribute Details

#aaObject

Returns the value of attribute aa.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def aa
  @aa
end

#additionalObject (readonly)

Returns the value of attribute additional.



1146
1147
1148
# File 'lib/net/dns/resolv.rb', line 1146

def additional
  @additional
end

#answerObject (readonly)

Returns the value of attribute answer.



1146
1147
1148
# File 'lib/net/dns/resolv.rb', line 1146

def answer
  @answer
end

#authorityObject (readonly)

Returns the value of attribute authority.



1146
1147
1148
# File 'lib/net/dns/resolv.rb', line 1146

def authority
  @authority
end

#idObject

Returns the value of attribute id.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def id
  @id
end

#opcodeObject

Returns the value of attribute opcode.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def opcode
  @opcode
end

#qrObject

Returns the value of attribute qr.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def qr
  @qr
end

#questionObject (readonly)

Returns the value of attribute question.



1146
1147
1148
# File 'lib/net/dns/resolv.rb', line 1146

def question
  @question
end

#raObject

Returns the value of attribute ra.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def ra
  @ra
end

#rcodeObject

Returns the value of attribute rcode.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def rcode
  @rcode
end

#rdObject

Returns the value of attribute rd.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def rd
  @rd
end

#tcObject

Returns the value of attribute tc.



1145
1146
1147
# File 'lib/net/dns/resolv.rb', line 1145

def tc
  @tc
end

Class Method Details

.decode(m) ⇒ Object



1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
# File 'lib/net/dns/resolv.rb', line 1311

def Message.decode(m)
  o = Message.new(0)
  MessageDecoder.new(m) {|msg|
    id, flag, qdcount, ancount, nscount, arcount =
      msg.get_unpack('nnnnnn')
    o.id = id
    o.qr = (flag >> 15) & 1
    o.opcode = (flag >> 11) & 15
    o.aa = (flag >> 10) & 1
    o.tc = (flag >> 9) & 1
    o.rd = (flag >> 8) & 1
    o.ra = (flag >> 7) & 1
    o.rcode = flag & 15
    (1..qdcount).each {
      name, typeclass, unicast = msg.get_question
      o.add_question(name, typeclass, unicast)
    }
    (1..ancount).each {
      name, ttl, data, cacheflush = msg.get_rr
      o.add_answer(name, ttl, data)
    }
    (1..nscount).each {
      name, ttl, data = msg.get_rr
      o.add_authority(name, ttl, data)
    }
    (1..arcount).each {
      name, ttl, data = msg.get_rr
      o.add_additional(name, ttl, data)
    }
  }
  return o
end

Instance Method Details

#==(other) ⇒ Object



1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
# File 'lib/net/dns/resolv.rb', line 1148

def ==(other)
  return @id == other.id &&
         @qr == other.qr &&
         @opcode == other.opcode &&
         @aa == other.aa &&
         @tc == other.tc &&
         @rd == other.rd &&
         @ra == other.ra &&
         @rcode == other.rcode &&
         @question == other.question &&
         @answer == other.answer &&
         @authority == other.authority &&
         @additional == other.additional
end

#add_additional(name, ttl, data) ⇒ Object



1199
1200
1201
# File 'lib/net/dns/resolv.rb', line 1199

def add_additional(name, ttl, data)
  @additional << [Name.create(name), ttl, data]
end

#add_answer(name, ttl, data, cacheflush = false) ⇒ Object



1176
1177
1178
# File 'lib/net/dns/resolv.rb', line 1176

def add_answer(name, ttl, data, cacheflush = false)
  @answer << [Name.create(name), ttl, data, cacheflush]
end

#add_authority(name, ttl, data) ⇒ Object



1189
1190
1191
# File 'lib/net/dns/resolv.rb', line 1189

def add_authority(name, ttl, data)
  @authority << [Name.create(name), ttl, data]
end

#add_question(name, typeclass, unicast = false) ⇒ Object



1163
1164
1165
# File 'lib/net/dns/resolv.rb', line 1163

def add_question(name, typeclass, unicast = false)
  @question << [Name.create(name), typeclass, unicast]
end

#each_additionalObject



1203
1204
1205
1206
1207
# File 'lib/net/dns/resolv.rb', line 1203

def each_additional
  @additional.each {|name, ttl, data|
    yield name, ttl, data
  }
end

#each_answerObject

Can accept either |name, ttl, data| as block arguments (backwards-compatible/DNS-style), or |name, ttl, data, cacheflush| (mDNS-style).



1183
1184
1185
1186
1187
# File 'lib/net/dns/resolv.rb', line 1183

def each_answer # :yields: name, ttl, data, cacheflush
  @answer.each {|ary|
    yield ary
  }
end

#each_authorityObject



1193
1194
1195
1196
1197
# File 'lib/net/dns/resolv.rb', line 1193

def each_authority
  @authority.each {|name, ttl, data|
    yield name, ttl, data
  }
end

#each_questionObject

Can accept either |name, typeclass| as block arguments (backwards-compatible/DNS-style), or |name, typeclass, unicast| (mDNS-style).



1170
1171
1172
1173
1174
# File 'lib/net/dns/resolv.rb', line 1170

def each_question # :yields: name, typeclass, unicast
  @question.each {|ary|
    yield ary
  }
end

#each_resourceObject



1209
1210
1211
1212
1213
# File 'lib/net/dns/resolv.rb', line 1209

def each_resource
  each_answer {|name, ttl, data| yield name, ttl, data}
  each_authority {|name, ttl, data| yield name, ttl, data}
  each_additional {|name, ttl, data| yield name, ttl, data}
end

#encodeObject



1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
# File 'lib/net/dns/resolv.rb', line 1215

def encode
  return MessageEncoder.new {|msg|
    msg.put_pack('nnnnnn',
      @id,
      (@qr & 1) << 15 |
      (@opcode & 15) << 11 |
      (@aa & 1) << 10 |
      (@tc & 1) << 9 |
      (@rd & 1) << 8 |
      (@ra & 1) << 7 |
      (@rcode & 15),
      @question.length,
      @answer.length,
      @authority.length,
      @additional.length)
    @question.each {|q|
      name, typeclass, unicast = q
      hibit = unicast ? (1<<15) : 0x00
      msg.put_name(name)
      msg.put_pack('nn', typeclass::TypeValue, typeclass::ClassValue|hibit)
    }
    [@answer, @authority, @additional].each {|rr|
      rr.each {|r|
        name, ttl, data, cacheflush = r
        hibit = cacheflush ? (1<<15) : 0x00
        msg.put_name(name)
        msg.put_pack('nnN', data.class::TypeValue, data.class::ClassValue|hibit, ttl)
        msg.put_length16 {data.encode_rdata(msg)}
      }
    }
  }.to_s
end

#query?Boolean

Returns true if message is a query.

Returns:

  • (Boolean)


16
17
18
# File 'lib/net/dns/resolvx.rb', line 16

def query?
  qr == 0
end

#response?Boolean

Returns true if message is a response.

Returns:

  • (Boolean)


21
22
23
# File 'lib/net/dns/resolvx.rb', line 21

def response?
  !query?
end