private void ResolveCNAME(DnsQuestionRecord question, DnsResourceRecord lastCNAME, bool serveStale, List <DnsResourceRecord> answerRecords) { int queryCount = 0; do { if (!_root.TryGet((lastCNAME.RDATA as DnsCNAMERecord).Domain, out CacheZone cacheZone)) { break; } IReadOnlyList <DnsResourceRecord> records = cacheZone.QueryRecords(question.Type, serveStale, true); if (records.Count < 1) { break; } answerRecords.AddRange(records); if (records[0].Type != DnsResourceRecordType.CNAME) { break; } lastCNAME = records[0]; }while (++queryCount < DnsServer.MAX_CNAME_HOPS); }
public IReadOnlyList <DnsResourceRecord> QueryRecords(string domain, DnsResourceRecordType type) { if (_root.TryGet(domain, out AuthZone zone)) { return(zone.QueryRecords(type)); } return(Array.Empty <DnsResourceRecord>()); }
public List <DnsResourceRecord> ListAllRecords(string domain) { if (_root.TryGet(domain, out CacheZone zone)) { return(zone.ListAllRecords()); } return(new List <DnsResourceRecord>(0)); }
private AuthZone CreateEmptyZone(AuthZoneInfo zoneInfo) { AuthZone zone; switch (zoneInfo.Type) { case AuthZoneType.Primary: zone = new PrimaryZone(_dnsServer, zoneInfo); break; case AuthZoneType.Secondary: zone = new SecondaryZone(_dnsServer, zoneInfo); break; case AuthZoneType.Stub: zone = new StubZone(_dnsServer, zoneInfo); break; case AuthZoneType.Forwarder: zone = new ForwarderZone(zoneInfo); break; default: throw new InvalidDataException("DNS zone type not supported."); } if (_root.TryAdd(zone)) { _totalZones++; return(zone); } if (_root.TryGet(zoneInfo.Name, out AuthZone existingZone) && (existingZone is SubDomainZone)) { _root[zoneInfo.Name] = zone; _totalZones++; return(zone); } throw new DnsServerException("Zone already exists: " + zoneInfo.Name); }