コード例 #1
0
    def _handle_non_authoritative_response(
            self, dns_response: DNSMessage, requested_domain_name: str,
            requested_type: int) -> List[ResourceRecord]:
        """
        Attempts to find a name server address to send the next name resolution request to.

        If the name server ip is included in the additional resource records, then use it for next dns query.

        If name server ip is not present, first resolve the name server domain name to an ipv4 address and send the
        next dns query there.

        :param dns_response: the most recently received dns response in the name resolution process.
        :param requested_domain_name: the domain name we wish to resolve.
        :param requested_type: the type of address we wish to resolve the domain name to.
        :return: a list of the answer records that match the desired domain name and type, if present.
        """
        name_server_ip: Optional[
            str] = dns_response.get_name_server_ip_address(
                dns_response.name_server_records,
                dns_response.additional_records)

        if name_server_ip:  # Response contains an address for one of the name servers, send packet to that server.
            return self.resolve_domain_name(requested_domain_name,
                                            name_server_ip, requested_type)

        else:
            # Name server ip address could not be found. Thus, resolve the name server domain name. When found,
            # use the resolved ip address to continue search for originally desired domain name.
            name_server_records: List[
                ResourceRecord] = self.resolve_domain_name(
                    dns_response.name_server_records[0].rdata,
                    self.starting_dns_server, 1)
            name_server_ip = name_server_records[0].rdata
            return self.resolve_domain_name(requested_domain_name,
                                            name_server_ip, requested_type)
コード例 #2
0
    def test_get_name_server_ip_address_only_one_match(self):
        """
        Test case for where there is only one possible match for any of the name server records.
        """

        name_server_ip: Optional[str] = DNSMessage.get_name_server_ip_address(
            self.name_server_records_list_1, self.additional_records)

        self.assertEqual(name_server_ip, "1.2.3.4")
コード例 #3
0
    def test_get_name_server_ip_address_no_name_match(self):
        """
        Test case where there is no match for any name server record.
        """

        name_server_ip: Optional[str] = DNSMessage.get_name_server_ip_address(
            self.name_server_records_list_2, self.additional_records)

        self.assertEqual(name_server_ip, None)
コード例 #4
0
    def test_get_name_server_ip_address_no_additional_records(self):
        """
        Test case where no additional records are given.
        """

        name_server_ip: Optional[str] = DNSMessage.get_name_server_ip_address(
            self.name_server_records_list_1, [])

        self.assertEqual(name_server_ip, None)
コード例 #5
0
    def test_get_name_server_ip_address_multiple_matches(self):
        """
        Test case to retrieve the ip address of a name server for which there is a match of the correct type
        and there is only one match in the additional records.
        """

        name_server_ip: Optional[str] = DNSMessage.get_name_server_ip_address(
            self.name_server_records_list_3, self.additional_records)

        self.assertEqual(name_server_ip, "1.2.3.4")