mirror of
https://github.com/golang/go.git
synced 2025-11-10 21:51:05 +00:00
net: use golang.org/x/net/dns/dnsmessage for DNS resolution
Vendors golang.org/x/net/dns/dnsmessage from x/net git rev 892bf7b0c6e2f93b51166bf3882e50277fa5afc6 Updates #16218 Updates #21160 Change-Id: Ic4e8f3c3d83c2936354ec14c5be93b0d2b42dd91 Reviewed-on: https://go-review.googlesource.com/37879 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
c830e05a20
commit
672729ebbd
11 changed files with 4167 additions and 1874 deletions
|
|
@ -9,6 +9,8 @@ package net
|
|||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"golang_org/x/net/dns/dnsmessage"
|
||||
)
|
||||
|
||||
var onceReadProtocols sync.Once
|
||||
|
|
@ -51,7 +53,7 @@ func lookupProtocol(_ context.Context, name string) (int, error) {
|
|||
return lookupProtocolMap(name)
|
||||
}
|
||||
|
||||
func (r *Resolver) dial(ctx context.Context, network, server string) (dnsConn, error) {
|
||||
func (r *Resolver) dial(ctx context.Context, network, server string) (Conn, error) {
|
||||
// Calling Dial here is scary -- we have to be sure not to
|
||||
// dial a name that will require a DNS lookup, or Dial will
|
||||
// call back here to translate it. The DNS config parser has
|
||||
|
|
@ -68,10 +70,7 @@ func (r *Resolver) dial(ctx context.Context, network, server string) (dnsConn, e
|
|||
if err != nil {
|
||||
return nil, mapErr(err)
|
||||
}
|
||||
if _, ok := c.(PacketConn); ok {
|
||||
return &dnsPacketConn{c}, nil
|
||||
}
|
||||
return &dnsStreamConn{c}, nil
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) lookupHost(ctx context.Context, host string) (addrs []string, err error) {
|
||||
|
|
@ -98,8 +97,8 @@ func (r *Resolver) lookupIP(ctx context.Context, host string) (addrs []IPAddr, e
|
|||
// cgo not available (or netgo); fall back to Go's DNS resolver
|
||||
order = hostLookupFilesDNS
|
||||
}
|
||||
addrs, _, err = r.goLookupIPCNAMEOrder(ctx, host, order)
|
||||
return
|
||||
ips, _, err := r.goLookupIPCNAMEOrder(ctx, host, order)
|
||||
return ips, err
|
||||
}
|
||||
|
||||
func (r *Resolver) lookupPort(ctx context.Context, network, service string) (int, error) {
|
||||
|
|
@ -134,53 +133,176 @@ func (r *Resolver) lookupSRV(ctx context.Context, service, proto, name string) (
|
|||
} else {
|
||||
target = "_" + service + "._" + proto + "." + name
|
||||
}
|
||||
cname, rrs, err := r.lookup(ctx, target, dnsTypeSRV)
|
||||
p, server, err := r.lookup(ctx, target, dnsmessage.TypeSRV)
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
srvs := make([]*SRV, len(rrs))
|
||||
for i, rr := range rrs {
|
||||
rr := rr.(*dnsRR_SRV)
|
||||
srvs[i] = &SRV{Target: rr.Target, Port: rr.Port, Priority: rr.Priority, Weight: rr.Weight}
|
||||
var srvs []*SRV
|
||||
var cname dnsmessage.Name
|
||||
for {
|
||||
h, err := p.AnswerHeader()
|
||||
if err == dnsmessage.ErrSectionDone {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return "", nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
if h.Type != dnsmessage.TypeSRV {
|
||||
if err := p.SkipAnswer(); err != nil {
|
||||
return "", nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
if cname.Length == 0 && h.Name.Length != 0 {
|
||||
cname = h.Name
|
||||
}
|
||||
srv, err := p.SRVResource()
|
||||
if err != nil {
|
||||
return "", nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
srvs = append(srvs, &SRV{Target: srv.Target.String(), Port: srv.Port, Priority: srv.Priority, Weight: srv.Weight})
|
||||
}
|
||||
byPriorityWeight(srvs).sort()
|
||||
return cname, srvs, nil
|
||||
return cname.String(), srvs, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) lookupMX(ctx context.Context, name string) ([]*MX, error) {
|
||||
_, rrs, err := r.lookup(ctx, name, dnsTypeMX)
|
||||
p, server, err := r.lookup(ctx, name, dnsmessage.TypeMX)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
mxs := make([]*MX, len(rrs))
|
||||
for i, rr := range rrs {
|
||||
rr := rr.(*dnsRR_MX)
|
||||
mxs[i] = &MX{Host: rr.Mx, Pref: rr.Pref}
|
||||
var mxs []*MX
|
||||
for {
|
||||
h, err := p.AnswerHeader()
|
||||
if err == dnsmessage.ErrSectionDone {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
if h.Type != dnsmessage.TypeMX {
|
||||
if err := p.SkipAnswer(); err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
mx, err := p.MXResource()
|
||||
if err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
mxs = append(mxs, &MX{Host: mx.MX.String(), Pref: mx.Pref})
|
||||
|
||||
}
|
||||
byPref(mxs).sort()
|
||||
return mxs, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) lookupNS(ctx context.Context, name string) ([]*NS, error) {
|
||||
_, rrs, err := r.lookup(ctx, name, dnsTypeNS)
|
||||
p, server, err := r.lookup(ctx, name, dnsmessage.TypeNS)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
nss := make([]*NS, len(rrs))
|
||||
for i, rr := range rrs {
|
||||
nss[i] = &NS{Host: rr.(*dnsRR_NS).Ns}
|
||||
var nss []*NS
|
||||
for {
|
||||
h, err := p.AnswerHeader()
|
||||
if err == dnsmessage.ErrSectionDone {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
if h.Type != dnsmessage.TypeNS {
|
||||
if err := p.SkipAnswer(); err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
ns, err := p.NSResource()
|
||||
if err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
nss = append(nss, &NS{Host: ns.NS.String()})
|
||||
}
|
||||
return nss, nil
|
||||
}
|
||||
|
||||
func (r *Resolver) lookupTXT(ctx context.Context, name string) ([]string, error) {
|
||||
_, rrs, err := r.lookup(ctx, name, dnsTypeTXT)
|
||||
p, server, err := r.lookup(ctx, name, dnsmessage.TypeTXT)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
txts := make([]string, len(rrs))
|
||||
for i, rr := range rrs {
|
||||
txts[i] = rr.(*dnsRR_TXT).Txt
|
||||
var txts []string
|
||||
for {
|
||||
h, err := p.AnswerHeader()
|
||||
if err == dnsmessage.ErrSectionDone {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
if h.Type != dnsmessage.TypeTXT {
|
||||
if err := p.SkipAnswer(); err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
txt, err := p.TXTResource()
|
||||
if err != nil {
|
||||
return nil, &DNSError{
|
||||
Err: "cannot unmarshal DNS message",
|
||||
Name: name,
|
||||
Server: server,
|
||||
}
|
||||
}
|
||||
if len(txts) == 0 {
|
||||
txts = txt.TXT
|
||||
} else {
|
||||
txts = append(txts, txt.TXT...)
|
||||
}
|
||||
}
|
||||
return txts, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue