diff --git a/doh-server/config.go b/doh-server/config.go index e13aa2d..8264334 100644 --- a/doh-server/config.go +++ b/doh-server/config.go @@ -30,7 +30,7 @@ import ( ) type config struct { - Listen string `toml:"listen"` + Listen []string `toml:"listen"` Cert string `toml:"cert"` Key string `toml:"key"` Path string `toml:"path"` @@ -51,9 +51,10 @@ func loadConfig(path string) (*config, error) { return nil, &configError{fmt.Sprintf("unknown option %q", key.String())} } - if conf.Listen == "" { - conf.Listen = "127.0.0.1:8053" + if len(conf.Listen) == 0 { + conf.Listen = []string{"127.0.0.1:8053"} } + if conf.Path == "" { conf.Path = "/dns-query" } diff --git a/doh-server/doh-server.conf b/doh-server/doh-server.conf index 635277d..4d8afe1 100644 --- a/doh-server/doh-server.conf +++ b/doh-server/doh-server.conf @@ -1,5 +1,7 @@ # HTTP listen port -listen = "127.0.0.1:8053" +listen = [ + "127.0.0.1:8053" +] # TLS certification file cert = "" diff --git a/doh-server/server.go b/doh-server/server.go index fa990de..1cf8f8c 100644 --- a/doh-server/server.go +++ b/doh-server/server.go @@ -75,10 +75,27 @@ func (s *Server) Start() error { if s.conf.Verbose { servemux = handlers.CombinedLoggingHandler(os.Stdout, servemux) } - if s.conf.Cert != "" || s.conf.Key != "" { - return http.ListenAndServeTLS(s.conf.Listen, s.conf.Cert, s.conf.Key, servemux) + listeners := make(chan error, len(s.conf.Listen)) + for _, addr := range s.conf.Listen { + if s.conf.Cert != "" || s.conf.Key != "" { + go func() { + listeners <- http.ListenAndServeTLS(addr, s.conf.Cert, s.conf.Key, servemux) + }() + continue + } + go func() { + listeners <- http.ListenAndServe(addr, servemux) + }() } - return http.ListenAndServe(s.conf.Listen, servemux) + // wait for all handlers + for i := 0; i < cap(listeners); i++ { + err := <-listeners + if err != nil { + return err + } + } + close(listeners) + return nil } func (s *Server) handlerFunc(w http.ResponseWriter, r *http.Request) {