| 706 | } |
| 707 | |
| 708 | func checkHeader(p *dnsmessage.Parser, h dnsmessage.Header) error { |
| 709 | if h.RCode == dnsmessage.RCodeNameError { |
| 710 | return errNoSuchHost |
| 711 | } |
| 712 | _, err := p.AnswerHeader() |
| 713 | if err != nil && err != dnsmessage.ErrSectionDone { |
| 714 | return errCannotUnmarshalDNSMessage |
| 715 | } |
| 716 | if h.RCode == dnsmessage.RCodeSuccess && !h.Authoritative && !h.RecursionAvailable && err == dnsmessage.ErrSectionDone { |
| 717 | return errLameReferral |
| 718 | } |
| 719 | if h.RCode != dnsmessage.RCodeSuccess && h.RCode != dnsmessage.RCodeNameError { |
| 720 | if h.RCode == dnsmessage.RCodeServerFailure { |
| 721 | return errServerTemporarilyMisbehaving |
| 722 | } |
| 723 | return errServerMisbehaving |
| 724 | } |
| 725 | return nil |
| 726 | } |
| 727 | |
| 728 | func skipToAnswer(p *dnsmessage.Parser, qtype dnsmessage.Type) error { |
| 729 | for { |