diff --git a/app.go b/app.go index 8be0801d..0dccba5c 100644 --- a/app.go +++ b/app.go @@ -109,6 +109,7 @@ type Settings struct { ETag bool `json:"etag"` // Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only) + // Prefork is not support for IPv6 addresses // Default: "tcp" Network string @@ -489,12 +490,11 @@ func (app *App) Listen(address interface{}, tlsconfig ...*tls.Config) error { app.init() // Start prefork if app.Settings.Prefork { + if app.Settings.Network == "ipv6" || isIPv6(addr) { + log.Fatal("prefork does not support ipv6 networking") + } return app.prefork(addr, tlsconfig...) } - // tcp4 is the default network - if isIPv6(addr) { - // do some better parsing - } // Setup listener ln, err := net.Listen(app.Settings.Network, addr) if err != nil { @@ -675,10 +675,8 @@ func (app *App) startupMessage(addr string, tls bool, pids string) { logo += `%s __%s / __/ / / /_/ / __/ / %s` + "\n" logo += `%s /_/ /_/_.___/\___/_/%s %s` + "\n" - // statup details + host, port := parseAddr(addr) var ( - host = strings.Split(addr, ":")[0] - port = strings.Split(addr, ":")[1] tlsStr = "FALSE" routesLen = len(app.Routes()) osName = utils.ToUpper(runtime.GOOS) diff --git a/prefork.go b/prefork.go index 84d5a112..689ad4d8 100644 --- a/prefork.go +++ b/prefork.go @@ -32,7 +32,7 @@ func (app *App) prefork(addr string, tlsconfig ...*tls.Config) (err error) { runtime.GOMAXPROCS(1) var ln net.Listener // SO_REUSEPORT is not supported on Windows, use SO_REUSEADDR instead - if ln, err = reuseport(app.Settings.Network, addr); err != nil { + if ln, err = reuseport("tcp4", addr); err != nil { if !app.Settings.DisableStartupMessage { time.Sleep(100 * time.Millisecond) // avoid colliding with startup message } diff --git a/utils.go b/utils.go index afc9491e..e0eaa827 100644 --- a/utils.go +++ b/utils.go @@ -190,14 +190,17 @@ func parseTokenList(noneMatchBytes []byte) []string { return list } -// func isIPv4(address string) bool { -// return strings.Count(address, ":") < 2 -// } - func isIPv6(address string) bool { return strings.Count(address, ":") >= 2 } +func parseAddr(raw string) (host, port string) { + if i := strings.LastIndex(raw, ":"); i != -1 { + return raw[:i], raw[i+1:] + } + return raw, "" +} + // https://golang.org/src/net/net.go#L113 // Helper methods for application#test type testAddr string