Get the next request to send, and check the cache. Returns a (request, answer) tuple. At most one of request or answer will not be None.
(
self,
)
| 683 | self.backoff = 0.0 |
| 684 | |
| 685 | def next_request( |
| 686 | self, |
| 687 | ) -> Tuple[dns.message.QueryMessage | None, Answer | None]: |
| 688 | """Get the next request to send, and check the cache. |
| 689 | |
| 690 | Returns a (request, answer) tuple. At most one of request or |
| 691 | answer will not be None. |
| 692 | """ |
| 693 | |
| 694 | # We return a tuple instead of Union[Message,Answer] as it lets |
| 695 | # the caller avoid isinstance(). |
| 696 | |
| 697 | while len(self.qnames) > 0: |
| 698 | self.qname = self.qnames.pop(0) |
| 699 | |
| 700 | # Do we know the answer? |
| 701 | if self.resolver.cache: |
| 702 | answer = self.resolver.cache.get( |
| 703 | (self.qname, self.rdtype, self.rdclass) |
| 704 | ) |
| 705 | if answer is not None: |
| 706 | if answer.rrset is None and self.raise_on_no_answer: |
| 707 | raise NoAnswer(response=answer.response) |
| 708 | else: |
| 709 | return (None, answer) |
| 710 | answer = self.resolver.cache.get( |
| 711 | (self.qname, dns.rdatatype.ANY, self.rdclass) |
| 712 | ) |
| 713 | if answer is not None and answer.response.rcode() == dns.rcode.NXDOMAIN: |
| 714 | # cached NXDOMAIN; record it and continue to next |
| 715 | # name. |
| 716 | self.nxdomain_responses[self.qname] = answer.response |
| 717 | continue |
| 718 | |
| 719 | # Build the request |
| 720 | request = dns.message.make_query(self.qname, self.rdtype, self.rdclass) |
| 721 | if self.resolver.keyname is not None: |
| 722 | request.use_tsig( |
| 723 | self.resolver.keyring, |
| 724 | self.resolver.keyname, |
| 725 | algorithm=self.resolver.keyalgorithm, |
| 726 | ) |
| 727 | request.use_edns( |
| 728 | self.resolver.edns, |
| 729 | self.resolver.ednsflags, |
| 730 | self.resolver.payload, |
| 731 | options=self.resolver.ednsoptions, |
| 732 | ) |
| 733 | if self.resolver.flags is not None: |
| 734 | request.flags = self.resolver.flags |
| 735 | |
| 736 | self.nameservers = self.resolver._enrich_nameservers( |
| 737 | self.resolver._nameservers, |
| 738 | self.resolver.nameserver_ports, |
| 739 | self.resolver.port, |
| 740 | ) |
| 741 | if self.resolver.rotate: |
| 742 | random.shuffle(self.nameservers) |