@Override protected boolean isResponseCacheable(Question q, DNSMessage dnsMessage) { boolean res = super.isResponseCacheable(q, dnsMessage); return ReliableDNSClient.this.isResponseCacheable(q, dnsMessage) && res; } };
@Override protected DNSMessage.Builder newQuestion(DNSMessage.Builder questionMessage) { questionMessage = super.newQuestion(questionMessage); return ReliableDNSClient.this.newQuestion(questionMessage); } @Override
public static List<InetAddress> getRootServer(char rootServerId) { return getRootServer(rootServerId, ipVersionSetting); }
void recurse(InetAddress address, DNSMessage query) throws LoopDetected, MaxIterativeStepsReached { Question question = query.getQuestion(); if (!map.containsKey(address)) { map.put(address, new HashSet<Question>()); } else if (map.get(address).contains(question)) { throw new IterativeClientException.LoopDetected(); } if (++steps > recursiveDnsClient.maxSteps) { throw new IterativeClientException.MaxIterativeStepsReached(); } boolean isNew = map.get(address).add(question); assert(isNew); }
dnsMessage = dnsClient.query(q); if (dnsMessage != null) { unacceptableReason = isResponseAcceptable(dnsMessage); if (unacceptableReason == null) { return dnsMessage; dnsMessage = recursiveDnsClient.query(q); } catch (IOException ioException) { ioExceptions.add(ioException);
@Override protected boolean isResponseCacheable(Question q, DNSMessage dnsMessage) { return isResponseAcceptable(dnsMessage) == null; }
@Override protected DNSMessage.Builder newQuestion(DNSMessage.Builder questionMessage) { questionMessage = super.newQuestion(questionMessage); return ReliableDNSClient.this.newQuestion(questionMessage); } @Override
@Override protected boolean isResponseCacheable(Question q, DNSMessage dnsMessage) { boolean res = super.isResponseCacheable(q, dnsMessage); return ReliableDNSClient.this.isResponseCacheable(q, dnsMessage) && res; } };
@Override public void setDataSource(DNSDataSource dataSource) { super.setDataSource(dataSource); recursiveDnsClient.setDataSource(dataSource); dnsClient.setDataSource(dataSource); }
private DNSMessage queryRecursive(ResolutionState resolutionState, DNSMessage q, InetAddress address, DNSName authoritativeZone) throws IOException { resolutionState.recurse(address, q); DNSMessage resMessage = query(q, address); IpResultSet gluedNs = searchAdditional(resMessage, name); for (Iterator<InetAddress> addressIterator = gluedNs.addresses.iterator(); addressIterator.hasNext(); ) { InetAddress target = addressIterator.next(); DNSMessage recursive = null; try { recursive = queryRecursive(resolutionState, q, target, record.name); } catch (IOException e) { abortIfFatal(e); LOGGER.log(Level.FINER, "Exception while recursing", e); resolutionState.decrementSteps(); ioExceptions.add(e); if (!addressIterator.hasNext()) { res = resolveIpRecursive(resolutionState, name); } catch (IOException e) { resolutionState.decrementSteps(); ioExceptions.add(e); DNSMessage recursive = null; try { recursive = queryRecursive(resolutionState, q, target, record.name); } catch (IOException e) { resolutionState.decrementSteps(); ioExceptions.add(e); continue;
public IpResultSet build() { return new IpResultSet(ipv4Addresses, ipv6Addresses, random); } }
private IpResultSet.Builder newIpResultSetBuilder() { return new IpResultSet.Builder(this.insecureRandom); }
/** * Recursively query the DNS system for one entry. * * @param queryBuilder The query DNS message builder. * @return The response (or null on timeout/error). * @throws IOException if an IO error occurs. */ @Override protected DNSMessage query(DNSMessage.Builder queryBuilder) throws IOException { DNSMessage q = queryBuilder.build(); ResolutionState resolutionState = new ResolutionState(this); DNSMessage message = queryRecursive(resolutionState, q); return message; }
@SuppressWarnings("incomplete-switch") private IpResultSet searchAdditional(DNSMessage message, DNSName name) { IpResultSet.Builder res = newIpResultSetBuilder(); for (Record<? extends Data> record : message.additionalSection) { if (!record.name.equals(name)) { continue; } switch (record.type) { case A: res.ipv4Addresses.add(inetAddressFromRecord(name.ace, ((A) record.payloadData))); break; case AAAA: res.ipv6Addresses.add(inetAddressFromRecord(name.ace, ((AAAA) record.payloadData))); break; } } return res.build(); }
private IpResultSet resolveIpRecursive(ResolutionState resolutionState, DNSName name) throws IOException { IpResultSet.Builder res = newIpResultSetBuilder(); final DNSMessage query = getQueryFor(question); DNSMessage aMessage = queryRecursive(resolutionState, query); if (aMessage != null) { for (Record<? extends Data> answer : aMessage.answerSection) { if (answer.isAnswer(question)) { InetAddress inetAddress = inetAddressFromRecord(name.ace, (A) answer.payloadData); res.ipv4Addresses.add(inetAddress); } else if (answer.type == TYPE.CNAME && answer.name.equals(name)) { return resolveIpRecursive(resolutionState, ((CNAME) answer.payloadData).name); final DNSMessage query = getQueryFor(question); DNSMessage aMessage = queryRecursive(resolutionState, query); if (aMessage != null) { for (Record<? extends Data> answer : aMessage.answerSection) { if (answer.isAnswer(question)) { InetAddress inetAddress = inetAddressFromRecord(name.ace, (AAAA) answer.payloadData); res.ipv6Addresses.add(inetAddress); } else if (answer.type == TYPE.CNAME && answer.name.equals(name)) { return resolveIpRecursive(resolutionState, ((CNAME) answer.payloadData).name); return res.build();
for (A a : getCachedIPv4NameserverAddressesFor(parent)) { if (primaryTarget == null) { primaryTarget = a.getInetAddress(); for (AAAA aaaa : getCachedIPv6NameserverAddressesFor(parent)) { if (primaryTarget == null) { primaryTarget = aaaa.getInetAddress(); InetAddress[] v4v6targets = getTargets(getCachedIPv4NameserverAddressesFor(parent), getCachedIPv6NameserverAddressesFor(parent)); primaryTarget = v4v6targets[0]; secondaryTarget = v4v6targets[1]; break; case v6v4: InetAddress[] v6v4targets = getTargets(getCachedIPv6NameserverAddressesFor(parent), getCachedIPv4NameserverAddressesFor(parent)); primaryTarget = v6v4targets[0]; secondaryTarget = v6v4targets[1]; switch (ipVersionSetting) { case v4only: primaryTarget = getRandomIpv4RootServer(); break; case v6only: primaryTarget = getRandomIpv6RootServer(); break; case v4v6: primaryTarget = getRandomIpv4RootServer(); secondaryTarget = getRandomIpv6RootServer(); break; case v6v4:
@IntegrationTest public static NSID testNsidLRoot() { DNSClient client = new DNSClient(null) { @Override protected Builder newQuestion(Builder message) { message.getEdnsBuilder().addEdnsOption(NSID.REQUEST); return super.newQuestion(message); } }; DNSMessage response = null; Question q = new Question("de", TYPE.NS); for (InetAddress lRoot : IterativeDNSClient.getRootServer('l')) { try { response = client.query(q, lRoot); } catch (IOException e) { continue; } break; } NSID nsid = response.getEdns().getEdnsOption(OptionCode.NSID); assertNotNull(nsid); return nsid; } }