+2
-2
server/peer.go
+2
-2
server/peer.go
+10
-8
server/server.go
+10
-8
server/server.go
···
70
71
func (s *Server) handleConn(conn net.Conn) {
72
peer := newPeer(conn)
73
-
action, err := readAction(peer)
74
if err != nil {
75
slog.Error("failed to read action from peer", "error", err, "peer", peer.addr())
76
return
···
78
79
switch action {
80
case Subscribe:
81
-
s.handleSubscribe(&peer)
82
case Unsubscribe:
83
-
s.handleUnsubscribe(&peer)
84
case Publish:
85
-
s.handlePublish(&peer)
86
default:
87
slog.Error("unknown action", "action", action, "peer", peer.addr())
88
writeStatus(Error, "unknown action", peer.conn)
···
96
// keep handling the peers connection, getting the action from the peer when it wishes to do something else.
97
// once the peers connection ends, it will be unsubscribed from all topics and returned
98
for {
99
-
action, err := readAction(*peer)
100
if err != nil {
101
var neterr net.Error
102
if errors.As(err, &neterr) && neterr.Timeout() {
···
338
return nil
339
}
340
341
-
// TODO: work out why this can't take a pointer to the peer
342
-
func readAction(peer peer) (Action, error) {
343
var action Action
344
op := func(conn net.Conn) error {
345
-
conn.SetReadDeadline(time.Now().Add(time.Second))
346
347
err := binary.Read(conn, binary.BigEndian, &action)
348
if err != nil {
···
70
71
func (s *Server) handleConn(conn net.Conn) {
72
peer := newPeer(conn)
73
+
74
+
action, err := readAction(peer, 0)
75
if err != nil {
76
slog.Error("failed to read action from peer", "error", err, "peer", peer.addr())
77
return
···
79
80
switch action {
81
case Subscribe:
82
+
s.handleSubscribe(peer)
83
case Unsubscribe:
84
+
s.handleUnsubscribe(peer)
85
case Publish:
86
+
s.handlePublish(peer)
87
default:
88
slog.Error("unknown action", "action", action, "peer", peer.addr())
89
writeStatus(Error, "unknown action", peer.conn)
···
97
// keep handling the peers connection, getting the action from the peer when it wishes to do something else.
98
// once the peers connection ends, it will be unsubscribed from all topics and returned
99
for {
100
+
action, err := readAction(peer, time.Millisecond*100)
101
if err != nil {
102
var neterr net.Error
103
if errors.As(err, &neterr) && neterr.Timeout() {
···
339
return nil
340
}
341
342
+
func readAction(peer *peer, timeout time.Duration) (Action, error) {
343
var action Action
344
op := func(conn net.Conn) error {
345
+
if timeout > 0 {
346
+
conn.SetReadDeadline(time.Now().Add(timeout))
347
+
}
348
349
err := binary.Read(conn, binary.BigEndian, &action)
350
if err != nil {