[TestCase("", ".")] // should return the root label "."
        public void Parse_should_return_RootLabel_when_empty_or_dot_is_given(string query, string parsedValue)
        {
            // Act.
            IDnsString resultString = dnsString.Parse(query);

            // Assert.
            Assert.AreEqual(parsedValue, resultString.Value);
        }
Exemple #2
0
 /// <summary>Initializes a new instance of BaseResourceRecordInfo class.</summary>
 /// <param name="domainName">The <see cref="DnsString" /> used by the query.</param>
 /// <param name="recordType">Type of the record.</param>
 /// <param name="recordClass">The record class.</param>
 /// <param name="timeToLive">The time to live.</param>
 /// <param name="rawDataLength">Length of the raw data.</param>
 public BaseResourceRecordInfo(ResourceRecordType recordType, QueryClass recordClass, int timeToLive, int rawDataLength, IDnsString domainName)
 {
     DomainName        = domainName;
     RecordType        = recordType;
     RecordClass       = recordClass;
     RawDataLength     = rawDataLength;
     InitialTimeToLive = timeToLive;
     ticks             = Environment.TickCount;
 }
        public void Parse_should_successfully_parse_given_queryString(string query, string parsedValue)
        {
            // Arrange.

            // Act.
            IDnsString resultString = dnsString.Parse(query);

            // Assert.
            Assert.AreEqual(parsedValue, resultString.Value);
        }
        /// <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);
        }
        /*
         * 0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
         |                                               |
         | /                                               /
         | /                      NAME                     /
         |                                               |
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
         |                      TYPE                     |
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
         |                     CLASS                     |
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
         |                      TTL                      |
         |                                               |
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
         |                   RDLENGTH                    |
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
         | /                     RDATA                     /
         | /                                               /
         +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
         */

        public BaseResourceRecordInfo ReadRecordInfo(ArraySegment <byte> data)
        {
            IDnsString         domainName = _reader.ReadQuestionQueryString(data);                      // domain name
            ResourceRecordType recordType = (ResourceRecordType)_reader.ReadUInt16NetworkOrder(data);   // record type
            QueryClass         queryClass = (QueryClass)_reader.ReadUInt16NetworkOrder(data);           // query class
            int timeToLive    = (int)_reader.ReadUInt32NetworkOrder(data);                              // ttl - 32bit!!
            int rawDataLength = _reader.ReadUInt16NetworkOrder(data);                                   // RDLength

            return(new BaseResourceRecordInfo(
                       recordType,    // record type
                       queryClass,    // query class
                       timeToLive,    // ttl - 32bit!!
                       rawDataLength, // RDLength
                       domainName     // domain name
                       ));
        }
Exemple #6
0
        public void ReadQuestionQueryString_should_return_queryString_successfully()
        {
            // Arrange.

            const string        query      = "microsoft.com";
            const string        queryDot   = query + ".";
            ArraySegment <byte> sampleData = GetSampleData(ResponseDataSampleFile.QuestionQuery);

            mockDnsString.Setup(m => m.FromResponseQueryString(queryDot)).Returns(new DnsString(query, queryDot));


            IDnsDatagramReader reader = new DnsDatagramReader(mockDnsString.Object);

            // move the index to 12th byte where the query starts in the response data.
            reader.Advance(12);

            // Act.

            IDnsString dnsString = reader.ReadQuestionQueryString(sampleData);

            // Assert.
            Assert.AreEqual(dnsString.Original, query);
            Assert.AreEqual(dnsString.Value, queryDot);
        }
 public DnsQueryMessageProcessor(IDnsDatagramReader reader, IDnsString dnsString)
 {
     this.reader    = reader;
     this.dnsString = dnsString;
     random         = new Random();
 }
 public void Setup()
 {
     dnsString = new DnsString();
 }
Exemple #9
0
 public DnsDatagramReader(IDnsString dnsString)
 {
     this.dnsString = dnsString;
     //this.stringBuilder = stringBuilder;
     Index = 0;
 }
Exemple #10
0
 /// <summary> Initializes a new instance of 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(IDnsString query, QueryType questionType, QueryClass questionClass = QueryClass.IN)
 {
     QueryName     = query;
     QuestionType  = questionType;
     QuestionClass = questionClass;
 }