Fix in client the close event

This commit is contained in:
Zoltán Papp
2024-05-26 22:14:33 +02:00
parent 36b2cd16cc
commit 173ca25dac
12 changed files with 257 additions and 54 deletions
+2
View File
@@ -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
}
+2 -1
View File
@@ -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
}
-1
View File
@@ -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
View File
@@ -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 {