mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-03 20:19:07 +02:00
Fix in client the close event
This commit is contained in:
@@ -61,6 +61,7 @@ func (l *Listener) Close() error {
|
||||
l.lock.Lock()
|
||||
defer l.lock.Unlock()
|
||||
|
||||
log.Infof("closing UDP server")
|
||||
if l.listener == nil {
|
||||
return nil
|
||||
}
|
||||
@@ -95,6 +96,7 @@ func (l *Listener) readLoop() {
|
||||
}
|
||||
|
||||
pConn = NewConn(l.listener, addr)
|
||||
log.Infof("new connection from: %s", pConn.RemoteAddr())
|
||||
l.conns[addr.String()] = pConn
|
||||
go l.onAcceptFn(pConn)
|
||||
pConn.onNewMsg(buf[:n])
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package ws
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -24,7 +26,7 @@ func NewConn(wsConn *websocket.Conn) *Conn {
|
||||
func (c *Conn) Read(b []byte) (n int, err error) {
|
||||
t, r, err := c.NextReader()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return 0, ioErrHandling(err)
|
||||
}
|
||||
|
||||
if t != websocket.BinaryMessage {
|
||||
@@ -32,7 +34,11 @@ func (c *Conn) Read(b []byte) (n int, err error) {
|
||||
return 0, fmt.Errorf("unexpected message type")
|
||||
}
|
||||
|
||||
return r.Read(b)
|
||||
n, err = r.Read(b)
|
||||
if err != nil {
|
||||
return 0, ioErrHandling(err)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (c *Conn) Write(b []byte) (int, error) {
|
||||
@@ -55,3 +61,14 @@ func (c *Conn) SetDeadline(t time.Time) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func ioErrHandling(err error) error {
|
||||
var wErr *websocket.CloseError
|
||||
if !errors.As(err, &wErr) {
|
||||
return err
|
||||
}
|
||||
if wErr.Code == websocket.CloseNormalClosure {
|
||||
return io.EOF
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -42,7 +42,7 @@ func (l *Listener) Listen(acceptFn func(conn net.Conn)) error {
|
||||
Addr: l.address,
|
||||
}
|
||||
|
||||
log.Debugf("WS server is listening on address: %s", l.address)
|
||||
log.Infof("WS server is listening on address: %s", l.address)
|
||||
err := l.server.ListenAndServe()
|
||||
if errors.Is(err, http.ErrServerClosed) {
|
||||
return nil
|
||||
@@ -77,6 +77,7 @@ func (l *Listener) onAccept(writer http.ResponseWriter, request *http.Request) {
|
||||
return
|
||||
}
|
||||
conn := NewConn(wsConn)
|
||||
log.Infof("new connection from: %s", conn.RemoteAddr())
|
||||
l.acceptFn(conn)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ type Peer struct {
|
||||
}
|
||||
|
||||
func NewPeer(id []byte, conn net.Conn) *Peer {
|
||||
log.Debugf("new peer: %v", id)
|
||||
stringID := messages.HashIDToString(id)
|
||||
return &Peer{
|
||||
Log: log.WithField("peer_id", stringID),
|
||||
|
||||
+42
-8
@@ -1,15 +1,18 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"sync"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/netbirdio/netbird/relay/messages"
|
||||
"github.com/netbirdio/netbird/relay/server/listener"
|
||||
"github.com/netbirdio/netbird/relay/server/listener/udp"
|
||||
"github.com/netbirdio/netbird/relay/server/listener/ws"
|
||||
)
|
||||
|
||||
// Server
|
||||
@@ -19,7 +22,8 @@ import (
|
||||
type Server struct {
|
||||
store *Store
|
||||
|
||||
listener listener.Listener
|
||||
UDPListener listener.Listener
|
||||
WSListener listener.Listener
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
@@ -29,15 +33,45 @@ func NewServer() *Server {
|
||||
}
|
||||
|
||||
func (r *Server) Listen(address string) error {
|
||||
r.listener = udp.NewListener(address)
|
||||
return r.listener.Listen(r.accept)
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(2)
|
||||
|
||||
r.WSListener = ws.NewListener(address)
|
||||
var wslErr error
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
wslErr = r.WSListener.Listen(r.accept)
|
||||
if wslErr != nil {
|
||||
log.Errorf("failed to bind ws server: %s", wslErr)
|
||||
}
|
||||
}()
|
||||
|
||||
r.UDPListener = udp.NewListener(address)
|
||||
var udpLErr error
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
udpLErr = r.UDPListener.Listen(r.accept)
|
||||
if udpLErr != nil {
|
||||
log.Errorf("failed to bind ws server: %s", udpLErr)
|
||||
}
|
||||
}()
|
||||
|
||||
err := errors.Join(wslErr, udpLErr)
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *Server) Close() error {
|
||||
if r.listener == nil {
|
||||
return nil
|
||||
var wErr error
|
||||
if r.WSListener != nil {
|
||||
wErr = r.WSListener.Close()
|
||||
}
|
||||
return r.listener.Close()
|
||||
|
||||
var uErr error
|
||||
if r.UDPListener != nil {
|
||||
uErr = r.UDPListener.Close()
|
||||
}
|
||||
err := errors.Join(wErr, uErr)
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *Server) accept(conn net.Conn) {
|
||||
@@ -50,12 +84,12 @@ func (r *Server) accept(conn net.Conn) {
|
||||
}
|
||||
return
|
||||
}
|
||||
peer.Log.Debugf("peer connected from: %s", conn.RemoteAddr())
|
||||
peer.Log.Infof("peer connected from: %s", conn.RemoteAddr())
|
||||
|
||||
r.store.AddPeer(peer)
|
||||
defer func() {
|
||||
peer.Log.Debugf("teardown connection")
|
||||
r.store.DeletePeer(peer)
|
||||
peer.Log.Infof("peer left")
|
||||
}()
|
||||
|
||||
for {
|
||||
|
||||
Reference in New Issue
Block a user