golang.org/x/net@v0.25.1-0.20240516223405-c87a5b62e243/dns/dnsmessage/example_test.go (about)

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package dnsmessage_test
     6  
     7  import (
     8  	"fmt"
     9  	"net"
    10  	"strings"
    11  
    12  	"golang.org/x/net/dns/dnsmessage"
    13  )
    14  
    15  func ExampleParser() {
    16  	msg := dnsmessage.Message{
    17  		Header: dnsmessage.Header{Response: true, Authoritative: true},
    18  		Questions: []dnsmessage.Question{
    19  			{
    20  				Name:  dnsmessage.MustNewName("foo.bar.example.com."),
    21  				Type:  dnsmessage.TypeA,
    22  				Class: dnsmessage.ClassINET,
    23  			},
    24  			{
    25  				Name:  dnsmessage.MustNewName("bar.example.com."),
    26  				Type:  dnsmessage.TypeA,
    27  				Class: dnsmessage.ClassINET,
    28  			},
    29  		},
    30  		Answers: []dnsmessage.Resource{
    31  			{
    32  				Header: dnsmessage.ResourceHeader{
    33  					Name:  dnsmessage.MustNewName("foo.bar.example.com."),
    34  					Type:  dnsmessage.TypeA,
    35  					Class: dnsmessage.ClassINET,
    36  				},
    37  				Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}},
    38  			},
    39  			{
    40  				Header: dnsmessage.ResourceHeader{
    41  					Name:  dnsmessage.MustNewName("bar.example.com."),
    42  					Type:  dnsmessage.TypeA,
    43  					Class: dnsmessage.ClassINET,
    44  				},
    45  				Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 2}},
    46  			},
    47  		},
    48  	}
    49  
    50  	buf, err := msg.Pack()
    51  	if err != nil {
    52  		panic(err)
    53  	}
    54  
    55  	wantName := "bar.example.com."
    56  
    57  	var p dnsmessage.Parser
    58  	if _, err := p.Start(buf); err != nil {
    59  		panic(err)
    60  	}
    61  
    62  	for {
    63  		q, err := p.Question()
    64  		if err == dnsmessage.ErrSectionDone {
    65  			break
    66  		}
    67  		if err != nil {
    68  			panic(err)
    69  		}
    70  
    71  		if q.Name.String() != wantName {
    72  			continue
    73  		}
    74  
    75  		fmt.Println("Found question for name", wantName)
    76  		if err := p.SkipAllQuestions(); err != nil {
    77  			panic(err)
    78  		}
    79  		break
    80  	}
    81  
    82  	var gotIPs []net.IP
    83  	for {
    84  		h, err := p.AnswerHeader()
    85  		if err == dnsmessage.ErrSectionDone {
    86  			break
    87  		}
    88  		if err != nil {
    89  			panic(err)
    90  		}
    91  
    92  		if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET {
    93  			continue
    94  		}
    95  
    96  		if !strings.EqualFold(h.Name.String(), wantName) {
    97  			if err := p.SkipAnswer(); err != nil {
    98  				panic(err)
    99  			}
   100  			continue
   101  		}
   102  
   103  		switch h.Type {
   104  		case dnsmessage.TypeA:
   105  			r, err := p.AResource()
   106  			if err != nil {
   107  				panic(err)
   108  			}
   109  			gotIPs = append(gotIPs, r.A[:])
   110  		case dnsmessage.TypeAAAA:
   111  			r, err := p.AAAAResource()
   112  			if err != nil {
   113  				panic(err)
   114  			}
   115  			gotIPs = append(gotIPs, r.AAAA[:])
   116  		}
   117  	}
   118  
   119  	fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs)
   120  
   121  	// Output:
   122  	// Found question for name bar.example.com.
   123  	// Found A/AAAA records for name bar.example.com.: [127.0.0.2]
   124  }