Skip to content

Commit 40b2cde

Browse files
committed
chore: cleanup dns client code
1 parent 6786705 commit 40b2cde

File tree

1 file changed

+44
-53
lines changed

1 file changed

+44
-53
lines changed

dns/client.go

Lines changed: 44 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -16,53 +16,49 @@ import (
1616
)
1717

1818
type client struct {
19-
*D.Client
20-
port string
21-
host string
22-
dialer *dnsDialer
23-
addr string
19+
port string
20+
host string
21+
dialer *dnsDialer
22+
schema string
23+
skipCertVerify bool
2424
}
2525

2626
var _ dnsClient = (*client)(nil)
2727

2828
// Address implements dnsClient
2929
func (c *client) Address() string {
30-
if len(c.addr) != 0 {
31-
return c.addr
32-
}
33-
schema := "udp"
34-
if strings.HasPrefix(c.Client.Net, "tcp") {
35-
schema = "tcp"
36-
if strings.HasSuffix(c.Client.Net, "tls") {
37-
schema = "tls"
38-
}
39-
}
40-
41-
c.addr = fmt.Sprintf("%s://%s", schema, net.JoinHostPort(c.host, c.port))
42-
return c.addr
30+
return fmt.Sprintf("%s://%s", c.schema, net.JoinHostPort(c.host, c.port))
4331
}
4432

4533
func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (*D.Msg, error) {
4634
network := "udp"
47-
if strings.HasPrefix(c.Client.Net, "tcp") {
35+
if c.schema != "udp" {
4836
network = "tcp"
4937
}
5038

51-
tlsConfig, err := ca.GetTLSConfig(ca.Option{
52-
TLSConfig: c.Client.TLSConfig,
53-
})
54-
if err != nil {
55-
return nil, err
56-
}
57-
5839
addr := net.JoinHostPort(c.host, c.port)
5940
conn, err := c.dialer.DialContext(ctx, network, addr)
6041
if err != nil {
6142
return nil, err
6243
}
63-
defer func() {
64-
_ = conn.Close()
65-
}()
44+
defer conn.Close()
45+
46+
if c.schema == "tls" {
47+
tlsConfig, err := ca.GetTLSConfig(ca.Option{
48+
TLSConfig: &tls.Config{
49+
ServerName: c.host,
50+
InsecureSkipVerify: c.skipCertVerify,
51+
},
52+
})
53+
if err != nil {
54+
return nil, err
55+
}
56+
tlsConn := tls.Client(conn, tlsConfig)
57+
if err := tlsConn.HandshakeContext(ctx); err != nil {
58+
return nil, err
59+
}
60+
conn = tlsConn
61+
}
6662

6763
// miekg/dns ExchangeContext doesn't respond to context cancel.
6864
// this is a workaround
@@ -72,34 +68,30 @@ func (c *client) ExchangeContext(ctx context.Context, m *D.Msg) (*D.Msg, error)
7268
}
7369
ch := make(chan result, 1)
7470
go func() {
75-
if strings.HasSuffix(c.Client.Net, "tls") {
76-
conn = tls.Client(conn, tlsConfig)
71+
dClient := &D.Client{
72+
UDPSize: 4096,
73+
Timeout: 5 * time.Second,
7774
}
78-
7975
dConn := &D.Conn{
80-
Conn: conn,
81-
UDPSize: c.Client.UDPSize,
82-
TsigSecret: c.Client.TsigSecret,
83-
TsigProvider: c.Client.TsigProvider,
76+
Conn: conn,
77+
UDPSize: dClient.UDPSize,
8478
}
8579

86-
msg, _, err := c.Client.ExchangeWithConn(m, dConn)
80+
msg, _, err := dClient.ExchangeWithConn(m, dConn)
8781

8882
// Resolvers MUST resend queries over TCP if they receive a truncated UDP response (with TC=1 set)!
8983
if msg != nil && msg.Truncated && network == "udp" {
90-
tcpClient := *c.Client // copy a client
91-
tcpClient.Net = "tcp"
9284
network = "tcp"
9385
log.Debugln("[DNS] Truncated reply from %s:%s for %s over UDP, retrying over TCP", c.host, c.port, m.Question[0].String())
94-
dConn.Conn, err = c.dialer.DialContext(ctx, network, addr)
86+
var tcpConn net.Conn
87+
tcpConn, err = c.dialer.DialContext(ctx, network, addr)
9588
if err != nil {
9689
ch <- result{msg, err}
9790
return
9891
}
99-
defer func() {
100-
_ = conn.Close()
101-
}()
102-
msg, _, err = tcpClient.ExchangeWithConn(m, dConn)
92+
defer tcpConn.Close()
93+
dConn.Conn = tcpConn
94+
msg, _, err = dClient.ExchangeWithConn(m, dConn)
10395
}
10496

10597
ch <- result{msg, err}
@@ -118,20 +110,19 @@ func (c *client) ResetConnection() {}
118110
func newClient(addr string, resolver *Resolver, netType string, params map[string]string, proxyAdapter C.ProxyAdapter, proxyName string) *client {
119111
host, port, _ := net.SplitHostPort(addr)
120112
c := &client{
121-
Client: &D.Client{
122-
Net: netType,
123-
TLSConfig: &tls.Config{
124-
ServerName: host,
125-
},
126-
UDPSize: 4096,
127-
Timeout: 5 * time.Second,
128-
},
129113
port: port,
130114
host: host,
131115
dialer: newDNSDialer(resolver, proxyAdapter, proxyName),
116+
schema: "udp",
117+
}
118+
if strings.HasPrefix(netType, "tcp") {
119+
c.schema = "tcp"
120+
if strings.HasSuffix(netType, "tls") {
121+
c.schema = "tls"
122+
}
132123
}
133124
if params["skip-cert-verify"] == "true" {
134-
c.TLSConfig.InsecureSkipVerify = true
125+
c.skipCertVerify = true
135126
}
136127
return c
137128
}

0 commit comments

Comments
 (0)