Update client.go

This commit is contained in:
xiaolunzhou 2020-12-07 21:25:00 +08:00
parent 085ba97a6a
commit 8184bd3cd0

View File

@ -31,7 +31,6 @@ type Config struct {
Records []string
AlwaysTCP bool
CacheSize int
}
// Client is a dns client struct.
@ -168,51 +167,53 @@ func (c *Client) exchange(qname string, reqBytes []byte, preferTCP bool) (
if !preferTCP && !c.config.AlwaysTCP && dialer.Addr() == "DIRECT" {
network = "udp"
}
//init conn and option
//init conn and scheme
var rc net.Conn
var op string
var scheme string
for i := 0; i < ups.Len(); i++ {
u, err := url.Parse(ups.Server())
if err != nil {
server = ups.Server()
op=network
scheme = network
} else {
server = u.Host
op=u.Scheme
scheme = u.Scheme
}
//if not set option use network else use special option
switch op{
//if not set option use network else use special scheme
var e error
switch scheme {
case "tcp":
network = "tcp"
rc, err = dialer.Dial(network, server)
rc, e = dialer.Dial("tcp", server)
case "udp":
network = "udp"
rc, err = dialer.Dial(network, server)
rc, e = dialer.Dial("udp", server)
case "dot":
rc,err=tls.Dial("tcp",server,&tls.Config{InsecureSkipVerify: false,})
rc, e = tls.Dial("tcp", server, &tls.Config{InsecureSkipVerify: false})
case "doh":
net.DefaultResolver = &net.Resolver{}
default:
scheme=network
break
}
if err != nil {
if e != nil {
newServer := ups.SwitchIf(server)
log.F("[dns] error in resolving %s, failed to connect to server %v via %s: %v, next server: %s",
qname, server, dialer.Addr(), err, newServer)
server = newServer
continue
}
//TODO: if we use DOH (op=="doh") we don't need close connection
if op!="doh"{
//TODO: if we use DOH (scheme=="doh") we don't need close connection
if scheme != "doh" {
defer rc.Close()
}
// TODO: support timeout setting for different upstream server
if c.config.Timeout > 0 && op!="doh" {
if c.config.Timeout > 0 && scheme != "doh" {
rc.SetDeadline(time.Now().Add(time.Duration(c.config.Timeout) * time.Second))
}
switch op {
switch scheme {
case "tcp", "dot":
respBytes, err = c.exchangeTCP(rc, reqBytes)
case "udp":
@ -236,8 +237,9 @@ func (c *Client) exchange(qname string, reqBytes []byte, preferTCP bool) (
c.proxy.Record(dialer, false)
}
return server, op, dialer.Addr(), respBytes, err
return server, scheme, dialer.Addr(), respBytes, err
}
//exchangeHTTP exchange with server over https
func (c *Client) exchangeHTTPS(server string, reqBytes []byte) (body []byte, err error) {
query := strings.Replace(base64.URLEncoding.EncodeToString(reqBytes), "=", "", -1)
@ -253,6 +255,7 @@ func (c*Client) exchangeHTTPS(server string,reqBytes[]byte)(body[]byte,err error
}
return
}
// exchangeTCP exchange with server over tcp.
func (c *Client) exchangeTCP(rc net.Conn, reqBytes []byte) ([]byte, error) {
lenBuf := pool.GetBuffer(2)