From 1c665c68fb5196eaa965aab6180b1c5ae30b90b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 17 Jul 2024 00:10:43 +0900 Subject: [PATCH] fix(p2p): handle error on parsing endpoint --- gold/p2p/define.go | 4 ++-- gold/p2p/tcp/init.go | 14 ++++++++------ gold/p2p/tcp/tcp.go | 2 +- gold/p2p/udp/init.go | 10 ++++++---- gold/p2p/udp/udp.go | 3 ++- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/gold/p2p/define.go b/gold/p2p/define.go index 1959280..0c4aedf 100644 --- a/gold/p2p/define.go +++ b/gold/p2p/define.go @@ -12,7 +12,7 @@ var ( ErrEndpointTypeMistatch = errors.New("endpoint type mismatch") ) -type Initializer func(endpoint string, configs ...any) EndPoint +type Initializer func(endpoint string, configs ...any) (EndPoint, error) var factory syncx.Map[string, Initializer] @@ -32,7 +32,7 @@ func NewEndPoint(network, endpoint string, configs ...any) (EndPoint, error) { if !ok { return nil, errors.New("network " + network + " not found") } - return initializer(endpoint, configs...), nil + return initializer(endpoint, configs...) } type Conn interface { diff --git a/gold/p2p/tcp/init.go b/gold/p2p/tcp/init.go index e1873e8..a69a7d8 100644 --- a/gold/p2p/tcp/init.go +++ b/gold/p2p/tcp/init.go @@ -14,25 +14,27 @@ type Config struct { ReceiveChannelSize int } -func NewEndpoint(endpoint string, configs ...any) p2p.EndPoint { +func NewEndpoint(endpoint string, configs ...any) (p2p.EndPoint, error) { return newEndpoint(endpoint, configs...) } -func newEndpoint(endpoint string, configs ...any) *EndPoint { +func newEndpoint(endpoint string, configs ...any) (*EndPoint, error) { var cfg *Config if len(configs) == 0 || configs[0] == nil { cfg = &Config{} } else { cfg = configs[0].(*Config) } + addr, err := netip.ParseAddrPort(endpoint) + if err != nil { + return nil, err + } return &EndPoint{ - addr: net.TCPAddrFromAddrPort( - netip.MustParseAddrPort(endpoint), - ), + addr: net.TCPAddrFromAddrPort(addr), dialtimeout: cfg.DialTimeout, peerstimeout: cfg.PeersTimeout, recvchansize: cfg.ReceiveChannelSize, - } + }, nil } func init() { diff --git a/gold/p2p/tcp/tcp.go b/gold/p2p/tcp/tcp.go index 60fb743..22f7c54 100644 --- a/gold/p2p/tcp/tcp.go +++ b/gold/p2p/tcp/tcp.go @@ -112,7 +112,7 @@ func (conn *Conn) accept() { logrus.Info("[tcp] re-listen on", conn.addr) continue } - ep := newEndpoint(tcpconn.RemoteAddr().String(), &Config{ + ep, _ := newEndpoint(tcpconn.RemoteAddr().String(), &Config{ DialTimeout: conn.addr.dialtimeout, PeersTimeout: conn.addr.peerstimeout, ReceiveChannelSize: conn.addr.recvchansize, diff --git a/gold/p2p/udp/init.go b/gold/p2p/udp/init.go index c352b64..4b056df 100644 --- a/gold/p2p/udp/init.go +++ b/gold/p2p/udp/init.go @@ -7,10 +7,12 @@ import ( "github.com/fumiama/WireGold/gold/p2p" ) -func NewEndpoint(endpoint string, _ ...any) p2p.EndPoint { - return (*EndPoint)(net.UDPAddrFromAddrPort( - netip.MustParseAddrPort(endpoint), - )) +func NewEndpoint(endpoint string, _ ...any) (p2p.EndPoint, error) { + addr, err := netip.ParseAddrPort(endpoint) + if err != nil { + return nil, err + } + return (*EndPoint)(net.UDPAddrFromAddrPort(addr)), nil } func init() { diff --git a/gold/p2p/udp/udp.go b/gold/p2p/udp/udp.go index bc23e58..e91af9d 100644 --- a/gold/p2p/udp/udp.go +++ b/gold/p2p/udp/udp.go @@ -44,7 +44,8 @@ func (conn *Conn) String() string { } func (conn *Conn) LocalAddr() p2p.EndPoint { - return NewEndpoint((*net.UDPConn)(conn).LocalAddr().String()) + ep, _ := NewEndpoint((*net.UDPConn)(conn).LocalAddr().String()) + return ep } func (conn *Conn) ReadFromPeer(b []byte) (int, p2p.EndPoint, error) {