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.



1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
# File 'lib/resolv.rb', line 1319

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



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def aa
  @aa
end

#additionalObject (readonly)

Returns the value of attribute additional



1335
1336
1337
# File 'lib/resolv.rb', line 1335

def additional
  @additional
end

#answerObject (readonly)

Returns the value of attribute answer



1335
1336
1337
# File 'lib/resolv.rb', line 1335

def answer
  @answer
end

#authorityObject (readonly)

Returns the value of attribute authority



1335
1336
1337
# File 'lib/resolv.rb', line 1335

def authority
  @authority
end

#idObject

Returns the value of attribute id



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def id
  @id
end

#opcodeObject

Returns the value of attribute opcode



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def opcode
  @opcode
end

#qrObject

Returns the value of attribute qr



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def qr
  @qr
end

#questionObject (readonly)

Returns the value of attribute question



1335
1336
1337
# File 'lib/resolv.rb', line 1335

def question
  @question
end

#raObject

Returns the value of attribute ra



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def ra
  @ra
end

#rcodeObject

Returns the value of attribute rcode



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def rcode
  @rcode
end

#rdObject

Returns the value of attribute rd



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def rd
  @rd
end

#tcObject

Returns the value of attribute tc



1334
1335
1336
# File 'lib/resolv.rb', line 1334

def tc
  @tc
end

Class Method Details

.decode(m) ⇒ Object



1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
# File 'lib/resolv.rb', line 1493

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



1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
# File 'lib/resolv.rb', line 1337

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



1382
1383
1384
# File 'lib/resolv.rb', line 1382

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

#add_answer(name, ttl, data) ⇒ Object



1362
1363
1364
# File 'lib/resolv.rb', line 1362

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

#add_authority(name, ttl, data) ⇒ Object



1372
1373
1374
# File 'lib/resolv.rb', line 1372

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

#add_question(name, typeclass) ⇒ Object



1352
1353
1354
# File 'lib/resolv.rb', line 1352

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

#each_additionalObject



1386
1387
1388
1389
1390
# File 'lib/resolv.rb', line 1386

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

#each_answerObject



1366
1367
1368
1369
1370
# File 'lib/resolv.rb', line 1366

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

#each_authorityObject



1376
1377
1378
1379
1380
# File 'lib/resolv.rb', line 1376

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

#each_questionObject



1356
1357
1358
1359
1360
# File 'lib/resolv.rb', line 1356

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

#each_resourceObject



1392
1393
1394
1395
1396
# File 'lib/resolv.rb', line 1392

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



1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
# File 'lib/resolv.rb', line 1398

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