diff --git a/config/config.go b/config/config.go index ce3d550c..a93e7a3c 100644 --- a/config/config.go +++ b/config/config.go @@ -97,11 +97,24 @@ func ArrangeBindings(allConfigs []server.Config) (map[*net.TCPAddr][]server.Conf // Group configs by bind address for _, conf := range allConfigs { - addr, err := net.ResolveTCPAddr("tcp", conf.Address()) + newAddr, err := net.ResolveTCPAddr("tcp", conf.Address()) if err != nil { return addresses, errors.New("Could not serve " + conf.Address() + " - " + err.Error()) } - addresses[addr] = append(addresses[addr], conf) + + // Make sure to compare the string representation of the address, + // not the pointer, since a new *TCPAddr is created each time. + var existing bool + for addr := range addresses { + if addr.String() == newAddr.String() { + addresses[addr] = append(addresses[addr], conf) + existing = true + break + } + } + if !existing { + addresses[newAddr] = append(addresses[newAddr], conf) + } } // Don't allow HTTP and HTTPS to be served on the same address diff --git a/config/parse/parsing.go b/config/parse/parsing.go index d16ae6f6..bcf0a8e7 100644 --- a/config/parse/parsing.go +++ b/config/parse/parsing.go @@ -268,7 +268,7 @@ func standardAddress(str string) (host, port string, err error) { } host, port, err = net.SplitHostPort(str) - if err != nil { + if err != nil && schemePort == "" { host, port, err = net.SplitHostPort(str + ":") // tack on empty port } if err != nil && schemePort != "" { diff --git a/config/setup/tls.go b/config/setup/tls.go index efd6d798..7efc6825 100644 --- a/config/setup/tls.go +++ b/config/setup/tls.go @@ -14,10 +14,8 @@ func TLS(c *Controller) (middleware.Middleware, error) { c.TLS.Enabled = true if c.Port == "http" { c.TLS.Enabled = false - log.Printf("Warning: TLS was disabled on host http://%s."+ - " Make sure you are specifying https://%s in your config (if you haven't already)."+ - " If you meant to serve tls on port 80,"+ - " specify port 80 in your config (https://%s:80).", c.Host, c.Host, c.Host) + log.Printf("Warning: TLS disabled for %s://%s. To force TLS over the plaintext HTTP port, "+ + "specify port 80 explicitly (https://%s:80).", c.Port, c.Host, c.Host) } for c.Next() { diff --git a/main.go b/main.go index c66bf867..fb000518 100644 --- a/main.go +++ b/main.go @@ -78,39 +78,40 @@ func main() { }(s) app.Servers = append(app.Servers, s) + } - if !app.Quiet { - var checkedFdLimit bool + // Show initialization output + if !app.Quiet { + var checkedFdLimit bool + for addr, configs := range addresses { + for _, conf := range configs { + // Print address of site + fmt.Println(conf.Address()) - for addr, configs := range addresses { - for _, conf := range configs { - // Print address of site - fmt.Println(conf.Address()) - - // Note if non-localhost site resolves to loopback interface - if addr.IP.IsLoopback() && !isLocalhost(conf.Host) { - fmt.Printf("Notice: %s is only accessible on this machine (%s)\n", - conf.Host, addr.IP.String()) - } + // Note if non-localhost site resolves to loopback interface + if addr.IP.IsLoopback() && !isLocalhost(conf.Host) { + fmt.Printf("Notice: %s is only accessible on this machine (%s)\n", + conf.Host, addr.IP.String()) } + } - // Warn if ulimit is too low for production sites - if (runtime.GOOS == "linux" || runtime.GOOS == "darwin") && - !addr.IP.IsLoopback() && !checkedFdLimit { - out, err := exec.Command("ulimit", "-n").Output() - if err == nil { - // Note that an error here need not be reported - lim, err := strconv.Atoi(string(bytes.TrimSpace(out))) - if err == nil && lim < 4096 { - fmt.Printf("Warning: File descriptor limit is too low (%d) for production sites\n", lim) - } - checkedFdLimit = true + // Warn if ulimit is too low for production sites + if (runtime.GOOS == "linux" || runtime.GOOS == "darwin") && + !addr.IP.IsLoopback() && !checkedFdLimit { + out, err := exec.Command("ulimit", "-n").Output() + if err == nil { + // Note that an error here need not be reported + lim, err := strconv.Atoi(string(bytes.TrimSpace(out))) + if err == nil && lim < 4096 { + fmt.Printf("Warning: File descriptor limit is too low (%d) for production sites\n", lim) } + checkedFdLimit = true } } } } + // Wait for all listeners to stop app.Wg.Wait() }