Exemplo n.º 1
0
        public DnsResponseMessage GetResponseMessage(ArraySegment <byte> responseData)
        {
            var reader = new DnsDatagramReader(responseData);

            var id              = reader.ReadUInt16NetworkOrder();
            var flags           = reader.ReadUInt16NetworkOrder();
            var questionCount   = reader.ReadUInt16NetworkOrder();
            var answerCount     = reader.ReadUInt16NetworkOrder();
            var nameServerCount = reader.ReadUInt16NetworkOrder();
            var additionalCount = reader.ReadUInt16NetworkOrder();

            var header   = new DnsResponseHeader(id, flags, questionCount, answerCount, additionalCount, nameServerCount);
            var response = new DnsResponseMessage(header, responseData.Count);

            for (var questionIndex = 0; questionIndex < questionCount; questionIndex++)
            {
                var questionQueryString = reader.ReadQuestionQueryString();
                var queryTypeValue      = reader.ReadUInt16NetworkOrder();
                var queryClass          = reader.ReadUInt16NetworkOrder();
                if (!_queryTypes.TryGetValue(queryTypeValue, out var queryType))
                {
                    queryType = new PseudoResourceRecordType(
                        abbreviation: "Unknown",
                        value: queryTypeValue
                        );
                }
                var question = new DnsQuestion(questionQueryString, queryType, (QueryClass)queryClass);
                response.AddQuestion(question);
            }

            for (var answerIndex = 0; answerIndex < answerCount; answerIndex++)
            {
                var info   = ReadRecordInfo(reader);
                var record = _dnsRecordFactory.GetRecord(info, reader);
                response.AddAnswer(record);
            }

            for (var serverIndex = 0; serverIndex < nameServerCount; serverIndex++)
            {
                var info   = ReadRecordInfo(reader);
                var record = _dnsRecordFactory.GetRecord(info, reader);
                response.AddAuthority(record);
            }

            for (var additionalIndex = 0; additionalIndex < additionalCount; additionalIndex++)
            {
                var info   = ReadRecordInfo(reader);
                var record = _dnsRecordFactory.GetRecord(info, reader);
                response.AddAdditional(record);
            }

            return(response);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Reads a <see cref="ResourceRecord"/> from this <see cref="DnsDatagramReader"/>.
        /// </summary>
        private ResourceRecord ReadRecordInfo(DnsDatagramReader reader)
        {
            var queryString = reader.ReadQuestionQueryString();
            var type        = reader.ReadUInt16NetworkOrder();

            if (!_resourceRecordTypes.TryGetValue(type, out var resourceRecordType))
            {
                resourceRecordType = new PseudoResourceRecordType(
                    abbreviation: "Unknown - machine generated",
                    value: type
                    );
            }
            var queryClass = reader.ReadUInt16NetworkOrder();
            var ttl        = reader.ReadUInt32NetworkOrder();
            var rdLength   = reader.ReadUInt16NetworkOrder();

            return(new ResourceRecord(
                       queryString,            // name
                       resourceRecordType,     // type
                       (QueryClass)queryClass, // class
                       (int)ttl,               // ttl - 32bit!!
                       rdLength));             // RDLength
        }
Exemplo n.º 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DnsQuestion"/> class.
 /// </summary>
 /// <param name="query">The query.</param>
 /// <param name="questionType">Type of the question.</param>
 /// <param name="questionClass">The question class.</param>
 /// <exception cref="ArgumentNullException">If <paramref name="query"/> is null.</exception>
 public DnsQuestion(DnsString query, PseudoResourceRecordType questionType, QueryClass questionClass)
 {
     QueryName     = query ?? throw new ArgumentNullException(nameof(query));
     QuestionType  = questionType;
     QuestionClass = questionClass;
 }
Exemplo n.º 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DnsQuestion"/> class.
 /// </summary>
 /// <param name="query">The query.</param>
 /// <param name="questionType">Type of the question.</param>
 /// <param name="questionClass">The question class.</param>
 /// <exception cref="ArgumentNullException">If <paramref name="query"/> is null.</exception>
 public DnsQuestion(string query, PseudoResourceRecordType questionType, QueryClass questionClass)
     : this(DnsString.Parse(query), questionType, questionClass)
 {
 }
 private void Add(PseudoResourceRecordType type) => _dictionary[type.Value] = type;
Exemplo n.º 6
0
 /// <summary>
 /// Filters the elements of an <see cref="IEnumerable{T}"/> to return <see cref="DnsResourceRecord"/>s
 /// which have the <paramref name="type"/>.
 /// </summary>
 /// <param name="records">The records.</param>
 /// <param name="type">The <see cref="PseudoResourceRecordType"/> to filter for.</param>
 /// <returns>The list of <see cref="ARecord"/>.</returns>
 public static IEnumerable <DnsResourceRecord> OfRecordType(this IEnumerable <DnsResourceRecord> records, PseudoResourceRecordType type)
 {
     return(records.Where(p => p.RecordType == type));
 }