🔌 Add IPv6 support

Co-Authored-By: kiyon <kiyonlin@163.com>
pull/601/head
Fenny 2020-07-14 03:53:58 +02:00
parent b8fbaca1ea
commit 20cba2604b
3 changed files with 13 additions and 12 deletions

12
app.go
View File

@ -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)

View File

@ -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
}

View File

@ -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