public void DnsRecordFactory_ResolveARecord() { var header = new DnsResponseHeader(42, 256, 0, 1, 0, 0); var responseMessage = new DnsResponseMessage(header, 0); var info = new ResourceRecordInfo("query", ResourceRecordType.A, QueryClass.IN, 100, 4); var ip = IPAddress.Parse("123.45.67.9"); var answer = new ARecord(info, ip); responseMessage.AddAnswer(answer); var response = responseMessage.AsQueryResponse(new NameServer(ip)); var answerBytes = ip.GetAddressBytes(); var raw = GetResponseBytes(response, answerBytes); var handle = new DnsUdpMessageHandler(true); var result = handle.GetResponseMessage(new System.ArraySegment <byte>(raw)).AsQueryResponse(new NameServer(ip)); Assert.Equal(result.Answers.Count, 1); var resultAnswer = result.Answers.OfType <ARecord>().First(); Assert.Equal(resultAnswer.Address.ToString(), ip.ToString()); Assert.Equal(resultAnswer.DomainName.Value, "query."); Assert.Equal(resultAnswer.RawDataLength, 4); Assert.Equal(resultAnswer.RecordClass, QueryClass.IN); Assert.Equal(resultAnswer.RecordType, ResourceRecordType.A); Assert.True(resultAnswer.TimeToLive == 100); Assert.True(result.Header.Id == 42); Assert.True(result.Header.AnswerCount == 1); }
private DnsResponseMessage GetDnsResponseMessage(int headerId = 0, string ipAddress = "10.0.0.10", string domainNameToResolveRoot = "www.microsoft.com.", int ttl = 10, int rawDataLen = 1024) { DnsResponseHeader header = new DnsResponseHeader(headerId, 0, 0, 0, 0, 0); DnsResponseMessage message = new DnsResponseMessage(header, 0); mockDnsString.Setup(m => m.Value).Returns(domainNameToResolveRoot); message.Answers.Add(new ARecord(new BaseResourceRecordInfo(ResourceRecordType.A, QueryClass.IN, ttl, rawDataLen, mockDnsString.Object), IPAddress.Parse(ipAddress))); return(message); }
/// <summary> Constructs the response object based upon the data received from the DNS server. </summary> /// <param name="responseData">The data (byte[]) from the DNS server.</param> /// <returns>Response message object.</returns> public DnsResponseMessage ProcessResponse(ArraySegment <byte> responseData) { IDnsRecordFactory factory = new DnsRecordFactory(reader); /* * From index 0 till 11 bytes in the responseData array, we have the header items. */ ushort id = reader.ReadUInt16NetworkOrder(responseData); ushort flags = reader.ReadUInt16NetworkOrder(responseData); ushort questionCount = reader.ReadUInt16NetworkOrder(responseData); ushort answerCount = reader.ReadUInt16NetworkOrder(responseData); ushort nameServerCount = reader.ReadUInt16NetworkOrder(responseData); ushort additionalCount = reader.ReadUInt16NetworkOrder(responseData); /* * We have got above data, now build the response header. */ DnsResponseHeader header = new DnsResponseHeader(id, flags, questionCount, answerCount, additionalCount, nameServerCount); DnsResponseMessage response = new DnsResponseMessage(header, responseData.Count); /* * Next item in the response data is question that we sent to the DNS server which the server has copied onto the response message. */ for (int questionIndex = 0; questionIndex < questionCount; questionIndex++) { IDnsString questionString = reader.ReadQuestionQueryString(responseData); DnsQuestion question = new DnsQuestion(questionString, (QueryType)reader.ReadUInt16NetworkOrder(responseData), (QueryClass)reader.ReadUInt16NetworkOrder(responseData)); response.AddQuestion(question); } for (int answerIndex = 0; answerIndex < answerCount; answerIndex++) { BaseResourceRecordInfo info = factory.ReadRecordInfo(responseData); DnsResourceRecord record = factory.GetRecord(info, responseData); response.AddAnswer(record); } for (int serverIndex = 0; serverIndex < nameServerCount; serverIndex++) { BaseResourceRecordInfo info = factory.ReadRecordInfo(responseData); DnsResourceRecord record = factory.GetRecord(info, responseData); response.AddAuthority(record); } for (int additionalIndex = 0; additionalIndex < additionalCount; additionalIndex++) { BaseResourceRecordInfo info = factory.ReadRecordInfo(responseData); DnsResourceRecord record = factory.GetRecord(info, responseData); response.AddAdditional(record); } return(response); }