Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
 }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
                }
            }
        }
Beispiel #8
0
 public LookupClient()
     : this(NameServer.ResolveNameServers()?.ToArray())
 {
 }
Beispiel #9
0
 /// <summary>
 /// Gets the readonly representation of this message which can be returned.
 /// </summary>
 public DnsQueryResponse AsQueryResponse(NameServer nameServer)
 => new DnsQueryResponse(this, nameServer, Audit);
Beispiel #10
0
 /// <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);
Beispiel #11
0
 public void AuditRetryNextServer(NameServer current)
 {
     _auditWriter.AppendLine();
     _auditWriter.AppendLine($"; SERVER: {current.Endpoint.Address}#{current.Endpoint.Port} failed; Retrying with the next server.");
 }
Beispiel #12
0
 /// <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)
 {
 }
Beispiel #13
0
 /// <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 })
 {
 }
Beispiel #14
0
 // 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;
 }