Exemplo n.º 1
0
        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);
        }