1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-06-12 22:07:47 +02:00

fix ipv6 addr parsing and using

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Vasiliy Tolstov
2019-07-17 10:38:50 +03:00
parent d4fefc4b76
commit e688ab0a45
8 changed files with 104 additions and 68 deletions

View File

@ -3,6 +3,7 @@ package server
import (
"context"
"fmt"
"net"
"runtime/debug"
"sort"
"strconv"
@ -277,10 +278,11 @@ func (s *rpcServer) Subscribe(sb Subscriber) error {
}
func (s *rpcServer) Register() error {
var err error
var advt, host, port string
// parse address for host, port
config := s.Options()
var advt, host string
var port int
// check the advertise address first
// if it exists then use it, otherwise
@ -291,12 +293,17 @@ func (s *rpcServer) Register() error {
advt = config.Address
}
parts := strings.Split(advt, ":")
if len(parts) > 1 {
host = strings.Join(parts[:len(parts)-1], ":")
port, _ = strconv.Atoi(parts[len(parts)-1])
if idx := strings.Count(advt, ":"); idx > 1 {
// ipv6 address in format [host]:port or ipv4 host:port
host, port, err = net.SplitHostPort(advt)
if err != nil {
return err
}
if host == "::" {
host = fmt.Sprintf("[%s]", host)
}
} else {
host = parts[0]
host = advt
}
addr, err := addr.Extract(host)
@ -313,7 +320,7 @@ func (s *rpcServer) Register() error {
// register service
node := &registry.Node{
Id: config.Name + "-" + config.Id,
Address: fmt.Sprintf("%s:%d", addr, port),
Address: fmt.Sprintf("%s:%s", addr, port),
Metadata: md,
}
@ -413,9 +420,10 @@ func (s *rpcServer) Register() error {
}
func (s *rpcServer) Deregister() error {
var err error
var advt, host, port string
config := s.Options()
var advt, host string
var port int
// check the advertise address first
// if it exists then use it, otherwise
@ -426,12 +434,17 @@ func (s *rpcServer) Deregister() error {
advt = config.Address
}
parts := strings.Split(advt, ":")
if len(parts) > 1 {
host = strings.Join(parts[:len(parts)-1], ":")
port, _ = strconv.Atoi(parts[len(parts)-1])
if idx := strings.Count(advt, ":"); idx > 1 {
// ipv6 address in format [host]:port or ipv4 host:port
host, port, err = net.SplitHostPort(advt)
if err != nil {
return err
}
if host == "::" {
host = fmt.Sprintf("[%s]", host)
}
} else {
host = parts[0]
host = advt
}
addr, err := addr.Extract(host)
@ -441,7 +454,7 @@ func (s *rpcServer) Deregister() error {
node := &registry.Node{
Id: config.Name + "-" + config.Id,
Address: fmt.Sprintf("%s:%d", addr, port),
Address: fmt.Sprintf("%s:%s", addr, port),
}
service := &registry.Service{