(ctx context.Context, name string, qtype dnsmessage.Type)
| 744 | } |
| 745 | |
| 746 | func (tnet *Net) tryOneName(ctx context.Context, name string, qtype dnsmessage.Type) (dnsmessage.Parser, string, error) { |
| 747 | var lastErr error |
| 748 | |
| 749 | n, err := dnsmessage.NewName(name) |
| 750 | if err != nil { |
| 751 | return dnsmessage.Parser{}, "", errCannotMarshalDNSMessage |
| 752 | } |
| 753 | q := dnsmessage.Question{ |
| 754 | Name: n, |
| 755 | Type: qtype, |
| 756 | Class: dnsmessage.ClassINET, |
| 757 | } |
| 758 | |
| 759 | for i := 0; i < 2; i++ { |
| 760 | for _, server := range tnet.dnsServers { |
| 761 | p, h, err := tnet.exchange(ctx, server, q, time.Second*5) |
| 762 | if err != nil { |
| 763 | dnsErr := &net.DNSError{ |
| 764 | Err: err.Error(), |
| 765 | Name: name, |
| 766 | Server: server.String(), |
| 767 | } |
| 768 | if nerr, ok := err.(net.Error); ok && nerr.Timeout() { |
| 769 | dnsErr.IsTimeout = true |
| 770 | } |
| 771 | if _, ok := err.(*net.OpError); ok { |
| 772 | dnsErr.IsTemporary = true |
| 773 | } |
| 774 | lastErr = dnsErr |
| 775 | continue |
| 776 | } |
| 777 | |
| 778 | if err := checkHeader(&p, h); err != nil { |
| 779 | dnsErr := &net.DNSError{ |
| 780 | Err: err.Error(), |
| 781 | Name: name, |
| 782 | Server: server.String(), |
| 783 | } |
| 784 | if err == errServerTemporarilyMisbehaving { |
| 785 | dnsErr.IsTemporary = true |
| 786 | } |
| 787 | if err == errNoSuchHost { |
| 788 | dnsErr.IsNotFound = true |
| 789 | return p, server.String(), dnsErr |
| 790 | } |
| 791 | lastErr = dnsErr |
| 792 | continue |
| 793 | } |
| 794 | |
| 795 | err = skipToAnswer(&p, qtype) |
| 796 | if err == nil { |
| 797 | return p, server.String(), nil |
| 798 | } |
| 799 | lastErr = &net.DNSError{ |
| 800 | Err: err.Error(), |
| 801 | Name: name, |
| 802 | Server: server.String(), |
| 803 | } |
no test coverage detected