protected override void CacheRecords(IReadOnlyList <DnsResourceRecord> resourceRecords) { if (resourceRecords.Count == 1) { CacheZone zone = _root.GetOrAdd(resourceRecords[0].Name, delegate(string key) { return(new CacheZone(resourceRecords[0].Name)); }); zone.SetRecords(resourceRecords[0].Type, resourceRecords); } else { Dictionary <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByDomainRecords = DnsResourceRecord.GroupRecords(resourceRecords); //add grouped records foreach (KeyValuePair <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByTypeRecords in groupedByDomainRecords) { CacheZone zone = _root.GetOrAdd(groupedByTypeRecords.Key, delegate(string key) { return(new CacheZone(groupedByTypeRecords.Key)); }); foreach (KeyValuePair <DnsResourceRecordType, List <DnsResourceRecord> > groupedRecords in groupedByTypeRecords.Value) { zone.SetRecords(groupedRecords.Key, groupedRecords.Value); } } } }
protected override void CacheRecords(IReadOnlyList <DnsResourceRecord> resourceRecords) { //read and set glue records from base class foreach (DnsResourceRecord resourceRecord in resourceRecords) { IReadOnlyList <DnsResourceRecord> glueRecords = GetGlueRecordsFrom(resourceRecord); if (glueRecords.Count > 0) { resourceRecord.SetGlueRecords(glueRecords); } } if (resourceRecords.Count == 1) { DnsResourceRecord resourceRecord = resourceRecords[0]; if (resourceRecord.Name.Contains('*')) { return; } CacheZone zone = _root.GetOrAdd(resourceRecord.Name, delegate(string key) { return(new CacheZone(resourceRecord.Name, 1)); }); zone.SetRecords(resourceRecord.Type, resourceRecords, _dnsServer.ServeStale); } else { Dictionary <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByDomainRecords = DnsResourceRecord.GroupRecords(resourceRecords); bool serveStale = _dnsServer.ServeStale; //add grouped records foreach (KeyValuePair <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByTypeRecords in groupedByDomainRecords) { if (groupedByTypeRecords.Key.Contains('*')) { continue; } CacheZone zone = _root.GetOrAdd(groupedByTypeRecords.Key, delegate(string key) { return(new CacheZone(groupedByTypeRecords.Key, groupedByTypeRecords.Value.Count)); }); foreach (KeyValuePair <DnsResourceRecordType, List <DnsResourceRecord> > groupedRecords in groupedByTypeRecords.Value) { zone.SetRecords(groupedRecords.Key, groupedRecords.Value, serveStale); } } } }
protected override void CacheRecords(IReadOnlyList <DnsResourceRecord> resourceRecords) { List <DnsResourceRecord> dnameRecords = null; //read and set glue records from base class; also collect any DNAME records found foreach (DnsResourceRecord resourceRecord in resourceRecords) { IReadOnlyList <DnsResourceRecord> glueRecords = GetGlueRecordsFrom(resourceRecord); IReadOnlyList <DnsResourceRecord> rrsigRecords = GetRRSIGRecordsFrom(resourceRecord); IReadOnlyList <DnsResourceRecord> nsecRecords = GetNSECRecordsFrom(resourceRecord); if ((glueRecords is not null) || (rrsigRecords is not null) || (nsecRecords is not null)) { DnsResourceRecordInfo rrInfo = resourceRecord.GetRecordInfo(); rrInfo.GlueRecords = glueRecords; rrInfo.RRSIGRecords = rrsigRecords; rrInfo.NSECRecords = nsecRecords; if (glueRecords is not null) { foreach (DnsResourceRecord glueRecord in glueRecords) { IReadOnlyList <DnsResourceRecord> glueRRSIGRecords = GetRRSIGRecordsFrom(glueRecord); if (glueRRSIGRecords is not null) { glueRecord.GetRecordInfo().RRSIGRecords = glueRRSIGRecords; } } } if (nsecRecords is not null) { foreach (DnsResourceRecord nsecRecord in nsecRecords) { IReadOnlyList <DnsResourceRecord> nsecRRSIGRecords = GetRRSIGRecordsFrom(nsecRecord); if (nsecRRSIGRecords is not null) { nsecRecord.GetRecordInfo().RRSIGRecords = nsecRRSIGRecords; } } } } if (resourceRecord.Type == DnsResourceRecordType.DNAME) { if (dnameRecords is null) { dnameRecords = new List <DnsResourceRecord>(1); } dnameRecords.Add(resourceRecord); } } if (resourceRecords.Count == 1) { DnsResourceRecord resourceRecord = resourceRecords[0]; CacheZone zone = _root.GetOrAdd(resourceRecord.Name, delegate(string key) { return(new CacheZone(resourceRecord.Name, 1)); }); if (zone.SetRecords(resourceRecord.Type, resourceRecords, _dnsServer.ServeStale)) { Interlocked.Increment(ref _totalEntries); } } else { Dictionary <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByDomainRecords = DnsResourceRecord.GroupRecords(resourceRecords); bool serveStale = _dnsServer.ServeStale; int addedEntries = 0; //add grouped records foreach (KeyValuePair <string, Dictionary <DnsResourceRecordType, List <DnsResourceRecord> > > groupedByTypeRecords in groupedByDomainRecords) { if (dnameRecords is not null) { bool foundSynthesizedCNAME = false; foreach (DnsResourceRecord dnameRecord in dnameRecords) { if (groupedByTypeRecords.Key.EndsWith("." + dnameRecord.Name, StringComparison.OrdinalIgnoreCase)) { foundSynthesizedCNAME = true; break; } } if (foundSynthesizedCNAME) { continue; //do not cache synthesized CNAME } } CacheZone zone = _root.GetOrAdd(groupedByTypeRecords.Key, delegate(string key) { return(new CacheZone(groupedByTypeRecords.Key, groupedByTypeRecords.Value.Count)); }); foreach (KeyValuePair <DnsResourceRecordType, List <DnsResourceRecord> > groupedRecords in groupedByTypeRecords.Value) { if (zone.SetRecords(groupedRecords.Key, groupedRecords.Value, serveStale)) { addedEntries++; } } } if (addedEntries > 0) { Interlocked.Add(ref _totalEntries, addedEntries); } } }