mirror of
https://github.com/m13253/dns-over-https.git
synced 2026-10-29 01:12:26 +00:00
Add client support for multiple listen addresses
This commit is contained in:
1 parent
83f20767ea
commit
ce656ac3f7
3 files changed
+41
-36
No files matched your search
+35
-32
@@ -42,8 +42,8 @@ import (
|
|||||||
type Client struct {
|
type Client struct {
|
||||||
conf *config
|
conf *config
|
||||||
bootstrap []string
|
bootstrap []string
|
||||||
udpServer *dns.Server
|
udpServers []*dns.Server
|
||||||
tcpServer *dns.Server
|
tcpServers []*dns.Server
|
||||||
bootstrapResolver *net.Resolver
|
bootstrapResolver *net.Resolver
|
||||||
cookieJar *cookiejar.Jar
|
cookieJar *cookiejar.Jar
|
||||||
httpClientMux *sync.RWMutex
|
httpClientMux *sync.RWMutex
|
||||||
@@ -64,16 +64,21 @@ func NewClient(conf *config) (c *Client, err error) {
|
|||||||
c = &Client{
|
c = &Client{
|
||||||
conf: conf,
|
conf: conf,
|
||||||
}
|
}
|
||||||
c.udpServer = &dns.Server{
|
|
||||||
Addr: conf.Listen,
|
udpH := dns.HandlerFunc(c.udpHandlerFunc)
|
||||||
Net: "udp",
|
tcpH := dns.HandlerFunc(c.tcpHandlerFunc)
|
||||||
Handler: dns.HandlerFunc(c.udpHandlerFunc),
|
for _, addr := range conf.Listen {
|
||||||
UDPSize: 4096,
|
c.udpServers = append(c.udpServers, &dns.Server{
|
||||||
}
|
Addr: addr,
|
||||||
c.tcpServer = &dns.Server{
|
Net: "udp",
|
||||||
Addr: conf.Listen,
|
Handler: udpH,
|
||||||
Net: "tcp",
|
UDPSize: 4096,
|
||||||
Handler: dns.HandlerFunc(c.tcpHandlerFunc),
|
})
|
||||||
|
c.tcpServers = append(c.tcpServers, &dns.Server{
|
||||||
|
Addr: addr,
|
||||||
|
Net: "tcp",
|
||||||
|
Handler: tcpH,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
c.bootstrapResolver = net.DefaultResolver
|
c.bootstrapResolver = net.DefaultResolver
|
||||||
if len(conf.Bootstrap) != 0 {
|
if len(conf.Bootstrap) != 0 {
|
||||||
@@ -149,27 +154,25 @@ func (c *Client) newHTTPClient() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) Start() error {
|
func (c *Client) Start() error {
|
||||||
result := make(chan error)
|
result := make(chan error, len(c.udpServers)+len(c.tcpServers))
|
||||||
go func() {
|
for _, srv := range append(c.udpServers, c.tcpServers...) {
|
||||||
err := c.udpServer.ListenAndServe()
|
go func(srv *dns.Server) {
|
||||||
if err != nil {
|
err := srv.ListenAndServe()
|
||||||
log.Println(err)
|
if err != nil {
|
||||||
}
|
log.Println(err)
|
||||||
result <- err
|
}
|
||||||
}()
|
result <- err
|
||||||
go func() {
|
}(srv)
|
||||||
err := c.tcpServer.ListenAndServe()
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
}
|
|
||||||
result <- err
|
|
||||||
}()
|
|
||||||
err := <-result
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
err = <-result
|
|
||||||
return err
|
for i := 0; i < cap(result); i++ {
|
||||||
|
err := <-result
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(result)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) handlerFunc(w dns.ResponseWriter, r *dns.Msg, isTCP bool) {
|
func (c *Client) handlerFunc(w dns.ResponseWriter, r *dns.Msg, isTCP bool) {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type config struct {
|
type config struct {
|
||||||
Listen string `toml:"listen"`
|
Listen []string `toml:"listen"`
|
||||||
UpstreamGoogle []string `toml:"upstream_google"`
|
UpstreamGoogle []string `toml:"upstream_google"`
|
||||||
UpstreamIETF []string `toml:"upstream_ietf"`
|
UpstreamIETF []string `toml:"upstream_ietf"`
|
||||||
Bootstrap []string `toml:"bootstrap"`
|
Bootstrap []string `toml:"bootstrap"`
|
||||||
@@ -50,8 +50,8 @@ func loadConfig(path string) (*config, error) {
|
|||||||
return nil, &configError{fmt.Sprintf("unknown option %q", key.String())}
|
return nil, &configError{fmt.Sprintf("unknown option %q", key.String())}
|
||||||
}
|
}
|
||||||
|
|
||||||
if conf.Listen == "" {
|
if len(conf.Listen) == 0 {
|
||||||
conf.Listen = "127.0.0.1:53"
|
conf.Listen = []string{"127.0.0.1:53"}
|
||||||
}
|
}
|
||||||
if len(conf.UpstreamGoogle) == 0 && len(conf.UpstreamIETF) == 0 {
|
if len(conf.UpstreamGoogle) == 0 && len(conf.UpstreamIETF) == 0 {
|
||||||
conf.UpstreamGoogle = []string{"https://dns.google.com/resolve"}
|
conf.UpstreamGoogle = []string{"https://dns.google.com/resolve"}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
# DNS listen port
|
# DNS listen port
|
||||||
listen = "127.0.0.1:53"
|
listen = [
|
||||||
|
"127.0.0.1:53"
|
||||||
|
]
|
||||||
|
|
||||||
# HTTP path for upstream resolver
|
# HTTP path for upstream resolver
|
||||||
# If multiple servers are specified, a random one will be chosen each time.
|
# If multiple servers are specified, a random one will be chosen each time.
|
||||||
|
|||||||
Reference in new issue
Block a user