예제 #1
0
        public void TestSerializeMXRecord()
        {
            Tuple <MemoryStream, DNSOutputStream> out_info = DNSOutput();
            var record = new MXResource(1000, new Domain("mail.example.com"));

            record.Serialize(out_info.Item2);
            var record_bytes = out_info.Item1.ToArray();

            var expected = new byte[]
            {
                // Big-endian 1,000
                3,
                232,
                4, // Length of mail
                109,
                97,
                105,
                108,
                7, // Length of example
                101,
                120,
                97,
                109,
                112,
                108,
                101,
                3, // Length of com
                99,
                111,
                109,
                0,
            };

            Assert.That(record_bytes, Is.EqualTo(expected));
        }
예제 #2
0
        public void TestUnserializeMXResource()
        {
            var stream   = DNSInput(new byte[] { 3, 232, 4, 109, 97, 105, 108, 7, 101, 120, 97, 109, 112, 108, 101, 3, 99, 111, 109, 0 });
            var resource = MXResource.Unserialize(stream, 4);

            var expected = new MXResource(1000, new Domain("mail.example.com"));

            Assert.That(resource, Is.EqualTo(expected));
        }
예제 #3
0
        /**
         * Decodes the raw bytes of a DNS resource record into an
         * object.
         */
        public static DNSRecord Unserialize(DNSInputStream stream)
        {
            var name        = stream.ReadDomain();
            var record_type = (ResourceRecordType)stream.ReadUInt16();
            var class_type  = (AddressClass)stream.ReadUInt16();
            var ttl         = stream.ReadUInt32();

            var          record_size = stream.ReadUInt16();
            IDNSResource resource    = null;

            switch (record_type.Normalize())
            {
            case ResourceRecordType.HOST_ADDRESS:
                resource = AResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.NAME_SERVER:
                resource = NSResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.START_OF_AUTHORITY:
                resource = SOAResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.CANONICAL_NAME:
                resource = CNAMEResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.MAIL_EXCHANGE:
                resource = MXResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.POINTER:
                resource = PTRResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.HOST_6ADDRESS:
                resource = AAAAResource.Unserialize(stream, record_size);
                break;

            case ResourceRecordType.UNSUPPORTED:
                // Advance the byte counter - even if we can't parse it,
                // we have to properly ignore it
                stream.ReadBytes(record_size);
                resource = null;
                break;
            }

            return(new DNSRecord(name, class_type.Normalize(), ttl, resource));
        }