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); } } } }
private AuthZone GetOrAddSubDomainZone(string domain) { return(_root.GetOrAdd(domain, delegate(string key) { _ = _root.FindZone(domain, out _, out AuthZone authZone, out _); if (authZone == null) { throw new DnsServerException("Zone was not found for domain: " + domain); } if (authZone is PrimaryZone) { return new PrimarySubDomainZone(authZone as PrimaryZone, domain); } else if (authZone is SecondaryZone) { return new SecondarySubDomainZone(domain); } else if (authZone is ForwarderZone) { return new ForwarderSubDomainZone(domain); } throw new DnsServerException("Zone cannot have sub domains."); })); }