| // Copyright 2017 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | package dnsmessage_test | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"net" | 
 | 	"strings" | 
 |  | 
 | 	"golang.org/x/net/dns/dnsmessage" | 
 | ) | 
 |  | 
 | func ExampleParser() { | 
 | 	msg := dnsmessage.Message{ | 
 | 		Header: dnsmessage.Header{Response: true, Authoritative: true}, | 
 | 		Questions: []dnsmessage.Question{ | 
 | 			{ | 
 | 				Name:  dnsmessage.MustNewName("foo.bar.example.com."), | 
 | 				Type:  dnsmessage.TypeA, | 
 | 				Class: dnsmessage.ClassINET, | 
 | 			}, | 
 | 			{ | 
 | 				Name:  dnsmessage.MustNewName("bar.example.com."), | 
 | 				Type:  dnsmessage.TypeA, | 
 | 				Class: dnsmessage.ClassINET, | 
 | 			}, | 
 | 		}, | 
 | 		Answers: []dnsmessage.Resource{ | 
 | 			{ | 
 | 				Header: dnsmessage.ResourceHeader{ | 
 | 					Name:  dnsmessage.MustNewName("foo.bar.example.com."), | 
 | 					Type:  dnsmessage.TypeA, | 
 | 					Class: dnsmessage.ClassINET, | 
 | 				}, | 
 | 				Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}, | 
 | 			}, | 
 | 			{ | 
 | 				Header: dnsmessage.ResourceHeader{ | 
 | 					Name:  dnsmessage.MustNewName("bar.example.com."), | 
 | 					Type:  dnsmessage.TypeA, | 
 | 					Class: dnsmessage.ClassINET, | 
 | 				}, | 
 | 				Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 2}}, | 
 | 			}, | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	buf, err := msg.Pack() | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	wantName := "bar.example.com." | 
 |  | 
 | 	var p dnsmessage.Parser | 
 | 	if _, err := p.Start(buf); err != nil { | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	for { | 
 | 		q, err := p.Question() | 
 | 		if err == dnsmessage.ErrSectionDone { | 
 | 			break | 
 | 		} | 
 | 		if err != nil { | 
 | 			panic(err) | 
 | 		} | 
 |  | 
 | 		if q.Name.String() != wantName { | 
 | 			continue | 
 | 		} | 
 |  | 
 | 		fmt.Println("Found question for name", wantName) | 
 | 		if err := p.SkipAllQuestions(); err != nil { | 
 | 			panic(err) | 
 | 		} | 
 | 		break | 
 | 	} | 
 |  | 
 | 	var gotIPs []net.IP | 
 | 	for { | 
 | 		h, err := p.AnswerHeader() | 
 | 		if err == dnsmessage.ErrSectionDone { | 
 | 			break | 
 | 		} | 
 | 		if err != nil { | 
 | 			panic(err) | 
 | 		} | 
 |  | 
 | 		if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET { | 
 | 			continue | 
 | 		} | 
 |  | 
 | 		if !strings.EqualFold(h.Name.String(), wantName) { | 
 | 			if err := p.SkipAnswer(); err != nil { | 
 | 				panic(err) | 
 | 			} | 
 | 			continue | 
 | 		} | 
 |  | 
 | 		switch h.Type { | 
 | 		case dnsmessage.TypeA: | 
 | 			r, err := p.AResource() | 
 | 			if err != nil { | 
 | 				panic(err) | 
 | 			} | 
 | 			gotIPs = append(gotIPs, r.A[:]) | 
 | 		case dnsmessage.TypeAAAA: | 
 | 			r, err := p.AAAAResource() | 
 | 			if err != nil { | 
 | 				panic(err) | 
 | 			} | 
 | 			gotIPs = append(gotIPs, r.AAAA[:]) | 
 | 		} | 
 | 	} | 
 |  | 
 | 	fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) | 
 |  | 
 | 	// Output: | 
 | 	// Found question for name bar.example.com. | 
 | 	// Found A/AAAA records for name bar.example.com.: [127.0.0.2] | 
 | } |