From f1c3c69792aa4a68a5207c021df8bf087ff63906 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 14 Jan 2017 14:29:42 +0530 Subject: [PATCH] Zone: caching for ANY query response implemented. --- DnsServerCore/Zone.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/DnsServerCore/Zone.cs b/DnsServerCore/Zone.cs index a0d022e5..71252d59 100644 --- a/DnsServerCore/Zone.cs +++ b/DnsServerCore/Zone.cs @@ -511,6 +511,22 @@ namespace DnsServerCore } else { + foreach (DnsQuestionRecord question in response.Question) + { + uint ttl = 60; + + if (question.Type == DnsResourceRecordType.ANY) + { + Zone zone = CreateZone(rootZone, question.Name); + + DnsResourceRecord[] soaRecord = zone.GetRecord(question.Name, DnsResourceRecordType.SOA); + if ((soaRecord != null) && (soaRecord.Length > 0)) + ttl = (soaRecord[0].RDATA as DnsSOARecord).Minimum; + + zone.SetRecord(new DnsResourceRecord[] { new DnsResourceRecord(question.Name, DnsResourceRecordType.ANY, DnsClass.Internet, ttl, new DnsEmptyRecord()) }); + } + } + allRecords.AddRange(response.Answer); } break; @@ -641,13 +657,17 @@ namespace DnsServerCore else return zoneEntry.ResourceRecords; //return CNAME record } - else if (_authoritativeZone && (type == DnsResourceRecordType.ANY)) + else if (type == DnsResourceRecordType.ANY) { + if ((!_authoritativeZone) && !zoneTypeEntries.ContainsKey(type)) + return null; //domain does not exists in cache + List records = new List(5); foreach (KeyValuePair entry in zoneTypeEntries) { - records.AddRange(entry.Value.ResourceRecords); + if (entry.Key != DnsResourceRecordType.ANY) + records.AddRange(entry.Value.ResourceRecords); } return records.ToArray(); //all authoritative records