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); }
/// <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 }
/// <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; }
/// <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;
/// <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)); }