Class: Resolv::DNS::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/resolv.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.



1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
# File 'lib/resolv.rb', line 1176

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



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def aa
  @aa
end

#additionalObject (readonly)

Returns the value of attribute additional



1192
1193
1194
# File 'lib/resolv.rb', line 1192

def additional
  @additional
end

#answerObject (readonly)

Returns the value of attribute answer



1192
1193
1194
# File 'lib/resolv.rb', line 1192

def answer
  @answer
end

#authorityObject (readonly)

Returns the value of attribute authority



1192
1193
1194
# File 'lib/resolv.rb', line 1192

def authority
  @authority
end

#idObject

Returns the value of attribute id



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def id
  @id
end

#opcodeObject

Returns the value of attribute opcode



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def opcode
  @opcode
end

#qrObject

Returns the value of attribute qr



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def qr
  @qr
end

#questionObject (readonly)

Returns the value of attribute question



1192
1193
1194
# File 'lib/resolv.rb', line 1192

def question
  @question
end

#raObject

Returns the value of attribute ra



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def ra
  @ra
end

#rcodeObject

Returns the value of attribute rcode



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def rcode
  @rcode
end

#rdObject

Returns the value of attribute rd



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def rd
  @rd
end

#tcObject

Returns the value of attribute tc



1191
1192
1193
# File 'lib/resolv.rb', line 1191

def tc
  @tc
end

Class Method Details

.decode(m) ⇒ Object



1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
# File 'lib/resolv.rb', line 1348

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 = msg.get_question
      o.add_question(name, typeclass)
    }
    (1..ancount).each {
      name, ttl, data = 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



1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
# File 'lib/resolv.rb', line 1194

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



1239
1240
1241
# File 'lib/resolv.rb', line 1239

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

#add_answer(name, ttl, data) ⇒ Object



1219
1220
1221
# File 'lib/resolv.rb', line 1219

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

#add_authority(name, ttl, data) ⇒ Object



1229
1230
1231
# File 'lib/resolv.rb', line 1229

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

#add_question(name, typeclass) ⇒ Object



1209
1210
1211
# File 'lib/resolv.rb', line 1209

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

#each_additionalObject



1243
1244
1245
1246
1247
# File 'lib/resolv.rb', line 1243

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

#each_answerObject



1223
1224
1225
1226
1227
# File 'lib/resolv.rb', line 1223

def each_answer
  @answer.each {|name, ttl, data|
    yield name, ttl, data
  }
end

#each_authorityObject



1233
1234
1235
1236
1237
# File 'lib/resolv.rb', line 1233

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

#each_questionObject



1213
1214
1215
1216
1217
# File 'lib/resolv.rb', line 1213

def each_question
  @question.each {|name, typeclass|
    yield name, typeclass
  }
end

#each_resourceObject



1249
1250
1251
1252
1253
# File 'lib/resolv.rb', line 1249

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



1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
# File 'lib/resolv.rb', line 1255

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 = q
      msg.put_name(name)
      msg.put_pack('nn', typeclass::TypeValue, typeclass::ClassValue)
    }
    [@answer, @authority, @additional].each {|rr|
      rr.each {|r|
        name, ttl, data = r
        msg.put_name(name)
        msg.put_pack('nnN', data.class::TypeValue, data.class::ClassValue, ttl)
        msg.put_length16 {data.encode_rdata(msg)}
      }
    }
  }.to_s
end