@@ -16,53 +16,49 @@ import (
1616)
1717
1818type 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
2626var _ dnsClient = (* client )(nil )
2727
2828// Address implements dnsClient
2929func (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
4533func (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() {}
118110func 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