예제 #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="DnsQueryResult"/> class.
        /// </summary>
        /// <param name="response">The response.</param>
        internal DnsQueryResult(DnsClient.IDnsResponse response)
            : this()
        {
            Id = response.Id;
            IsAuthoritativeServer = response.IsAuthorativeServer;
            IsRecursionAvailable  = response.IsRecursionAvailable;
            IsTruncated           = response.IsTruncated;
            OperationCode         = response.OperationCode;
            ResponseCode          = response.ResponseCode;

            if (response.AnswerRecords != null)
            {
                foreach (var record in response.AnswerRecords)
                {
                    AnswerRecords.Add(new DnsRecord(record));
                }
            }

            if (response.AuthorityRecords != null)
            {
                foreach (var record in response.AuthorityRecords)
                {
                    AuthorityRecords.Add(new DnsRecord(record));
                }
            }

            if (response.AdditionalRecords != null)
            {
                foreach (var record in response.AdditionalRecords)
                {
                    AdditionalRecords.Add(new DnsRecord(record));
                }
            }
        }
예제 #2
0
        protected override void FinishParsing()
        {
            Prequisites =
                AnswerRecords.ConvertAll <PrequisiteBase>(
                    record =>
            {
                if ((record.RecordClass == RecordClass.Any) && (record.RecordDataLength == 0))
                {
                    return(new RecordExistsPrequisite(record.Name, record.RecordType));
                }
                else if (record.RecordClass == RecordClass.Any)
                {
                    return(new RecordExistsPrequisite(record));
                }
                else if ((record.RecordClass == RecordClass.None) && (record.RecordDataLength == 0))
                {
                    return(new RecordNotExistsPrequisite(record.Name, record.RecordType));
                }
                else if ((record.RecordClass == RecordClass.Any) && (record.RecordType == RecordType.Any))
                {
                    return(new NameIsInUsePrequisite(record.Name));
                }
                else if ((record.RecordClass == RecordClass.None) && (record.RecordType == RecordType.Any))
                {
                    return(new NameIsNotInUsePrequisite(record.Name));
                }
                else
                {
                    return(null);
                }
            }).Where(prequisite => (prequisite != null)).ToList();

            Updates =
                AuthorityRecords.ConvertAll <UpdateBase>(
                    record =>
            {
                if (record.TimeToLive != 0)
                {
                    return(new AddRecordUpdate(record));
                }
                else if ((record.RecordType == RecordType.Any) && (record.RecordClass == RecordClass.Any) && (record.RecordDataLength == 0))
                {
                    return(new DeleteAllRecordsUpdate(record.Name));
                }
                else if ((record.RecordClass == RecordClass.Any) && (record.RecordDataLength == 0))
                {
                    return(new DeleteRecordUpdate(record.Name, record.RecordType));
                }
                else if (record.RecordClass == RecordClass.None)
                {
                    return(new DeleteRecordUpdate(record));
                }
                else
                {
                    return(null);
                }
            }).Where(update => (update != null)).ToList();
        }
예제 #3
0
파일: Message.cs 프로젝트: schmitch/net-dns
        /// <inheritdoc />
        public override IWireSerialiser Read(WireReader reader)
        {
            Id = reader.ReadUInt16();
            var flags = reader.ReadUInt16();

            QR      = (flags & 0x8000) == 0x8000;
            AA      = (flags & 0x0400) == 0x0400;
            TC      = (flags & 0x0200) == 0x0200;
            RD      = (flags & 0x0100) == 0x0100;
            RA      = (flags & 0x0080) == 0x0080;
            opcode4 = (byte)((flags & 0x7800) >> 11);
            Z       = (flags & 0x0040) >> 6;
            AD      = (flags & 0x0020) == 0x0020;
            CD      = (flags & 0x0010) == 0x0010;
            Status  = (MessageStatus)(flags & 0x000F);
            var qdcount = reader.ReadUInt16();
            var ancount = reader.ReadUInt16();
            var nscount = reader.ReadUInt16();
            var arcount = reader.ReadUInt16();

            for (var i = 0; i < qdcount; ++i)
            {
                var question = (Question) new Question().Read(reader);
                Questions.Add(question);
            }
            for (var i = 0; i < ancount; ++i)
            {
                var rr = (ResourceRecord) new ResourceRecord().Read(reader);
                Answers.Add(rr);
            }
            for (var i = 0; i < nscount; ++i)
            {
                var rr = (ResourceRecord) new ResourceRecord().Read(reader);
                AuthorityRecords.Add(rr);
            }
            for (var i = 0; i < arcount; ++i)
            {
                var rr = (ResourceRecord) new ResourceRecord().Read(reader);
                AdditionalRecords.Add(rr);
            }

            return(this);
        }
예제 #4
0
파일: Message.cs 프로젝트: schmitch/net-dns
 /// <summary>
 ///   Make the message not exceed the specified length.
 /// </summary>
 /// <param name="length">
 ///   The maximum number bytes for the message.
 /// </param>
 /// <remarks>
 ///   If the message does not fit into <paramref name="length"/> bytes, then <see cref="AdditionalRecords"/>
 ///   are removed and then <see cref="AuthorityRecords"/> are removed.
 ///   <para>
 ///   If it is still too big, then the <see cref="TC"/> bit is set.
 ///   </para>
 /// </remarks>
 public void Truncate(int length)
 {
     while (Length() > length)
     {
         // Remove records.
         if (AdditionalRecords.Count > 0)
         {
             AdditionalRecords.RemoveAt(AdditionalRecords.Count - 1);
         }
         else if (AuthorityRecords.Count > 0)
         {
             AuthorityRecords.RemoveAt(AuthorityRecords.Count - 1);
         }
         else
         {
             // Nothing more can be done to reduce the message length.
             TC = true;
             return;
         }
     }
 }