public static string GetCacheKey(DnsQuestion question, NameServer server) { if (question == null) { throw new ArgumentNullException(nameof(question)); } if (server == null) { throw new ArgumentNullException(nameof(server)); } return(string.Concat(server.Endpoint.Address.ToString(), "#", server.Endpoint.Port.ToString(), "_", question.QueryName.Value, ":", (short)question.QuestionClass, ":", (short)question.QuestionType)); }
private void DisableServer(NameServer server) { lock (_endpointLock) { server.Enabled = false; if (_endpoints.Count(p => p.Enabled == true) == 0) { // reset all servers to try again... _endpoints.ToList().ForEach(p => p.Enabled = true); } } }
internal DnsQueryResponse(DnsResponseMessage dnsResponseMessage, NameServer nameServer) { if (dnsResponseMessage == null) { throw new ArgumentNullException(nameof(dnsResponseMessage)); } Header = dnsResponseMessage.Header; MessageSize = dnsResponseMessage.MessageSize; Questions = dnsResponseMessage.Questions; Answers = dnsResponseMessage.Answers; Additionals = dnsResponseMessage.Additionals; Authorities = dnsResponseMessage.Authorities; NameServer = nameServer; }
internal DnsQueryResponse(DnsResponseMessage dnsResponseMessage, NameServer nameServer, DnsQuerySettings settings) { if (dnsResponseMessage == null) { throw new ArgumentNullException(nameof(dnsResponseMessage)); } Header = dnsResponseMessage.Header; MessageSize = dnsResponseMessage.MessageSize; Questions = dnsResponseMessage.Questions.ToArray(); Answers = dnsResponseMessage.Answers.ToArray(); Additionals = dnsResponseMessage.Additionals.ToArray(); Authorities = dnsResponseMessage.Authorities.ToArray(); NameServer = nameServer ?? throw new ArgumentNullException(nameof(nameServer)); Settings = settings; }
internal DnsQueryResponse(DnsResponseMessage dnsResponseMessage, NameServer nameServer, LookupClientAudit audit) { if (dnsResponseMessage == null) { throw new ArgumentNullException(nameof(dnsResponseMessage)); } Header = dnsResponseMessage.Header; MessageSize = dnsResponseMessage.MessageSize; Questions = dnsResponseMessage.Questions.ToArray(); Answers = dnsResponseMessage.Answers.ToArray(); Additionals = dnsResponseMessage.Additionals.ToArray(); Authorities = dnsResponseMessage.Authorities.ToArray(); NameServer = nameServer ?? throw new ArgumentNullException(nameof(nameServer)); Audit = audit ?? throw new ArgumentNullException(nameof(audit)); }
private IEnumerable <NameServer> GetNextServers() { IEnumerable <NameServer> servers = null; if (_endpoints.Count > 1) { servers = _endpoints.Where(p => p.Enabled); NameServer server = null; if (_endpoints.TryDequeue(out server)) { _endpoints.Enqueue(server); } } else { servers = _endpoints; } return(servers); }
private void HandleOptRecords(Audit audit, NameServer serverInfo, DnsResponseMessage response) { var opt = response.Additionals.OfType <OptRecord>().FirstOrDefault(); if (opt != null) { if (EnableAuditTrail) { audit.AuditOptPseudo(); } serverInfo.SupportedUdpPayloadSize = opt.UdpSize; // TODO: handle opt records and remove them later response.Additionals.Remove(opt); if (EnableAuditTrail) { audit.AuditEdnsOpt(opt.UdpSize, opt.Version, opt.ResponseCodeEx); } } }
public LookupClient() : this(NameServer.ResolveNameServers()?.ToArray()) { }
/// <summary> /// Gets the readonly representation of this message which can be returned. /// </summary> public DnsQueryResponse AsQueryResponse(NameServer nameServer) => new DnsQueryResponse(this, nameServer, Audit);
/// <summary> /// Gets the readonly representation of this message which can be returned. /// </summary> public DnsQueryResponse AsQueryResponse(NameServer nameServer, DnsQuerySettings settings) => new DnsQueryResponse(this, nameServer, Audit, settings);
public void AuditRetryNextServer(NameServer current) { _auditWriter.AppendLine(); _auditWriter.AppendLine($"; SERVER: {current.Endpoint.Address}#{current.Endpoint.Port} failed; Retrying with the next server."); }
/// <summary> /// Creates a new instance of <see cref="LookupClientOptions"/> with one name server. /// <see cref="IPAddress"/> or <see cref="IPEndPoint"/> can be used as well thanks to implicit conversion. /// </summary> /// <param name="nameServer">The name servers.</param> public LookupClientOptions(NameServer nameServer) : base(nameServer) { }
/// <summary> /// Creates a new instance of <see cref="DnsQueryOptions"/> with one name server. /// <see cref="IPAddress"/> or <see cref="IPEndPoint"/> can be used as well thanks to implicit conversion. /// </summary> /// <param name="nameServer">The name servers.</param> public DnsQueryOptions(NameServer nameServer) : this(new[] { nameServer }) { }
// TODO: evalualte if defaulting resolveNameServers to false here and in the query plan, fall back to configured nameservers of the client /// <summary> /// Creates a new instance of <see cref="DnsQueryOptions"/> without name servers. /// </summary> /// <remarks> /// If no nameservers are configured, a query will fallback to the nameservers already configured on the <see cref="LookupClient"/> instance. /// </remarks> /// <param name="resolveNameServers">If set to <c>true</c>, <see cref="NameServer.ResolveNameServers(bool, bool)"/> /// will be used to get a list of nameservers.</param> public DnsQueryOptions(bool resolveNameServers = false) : this(resolveNameServers ? NameServer.ResolveNameServers() : null) { AutoResolvedNameServers = resolveNameServers; }