[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); }
/// <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 )); }
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(); }
public DnsDatagramReader(IDnsString dnsString) { this.dnsString = dnsString; //this.stringBuilder = stringBuilder; Index = 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; }