diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index 4d2c2edb6..b60ac56ea 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -280,8 +280,10 @@ func (s *Service) loop() { } } fullReport.Stop() - // Make sure the connection is closed + + // Close the current connection and establish a new one conn.Close() + errTimer.Reset(0) } } } @@ -296,8 +298,23 @@ func (s *Service) readLoop(conn *websocket.Conn) { for { // Retrieve the next generic network packet and bail out on error + var blob json.RawMessage + if err := conn.ReadJSON(&blob); err != nil { + log.Warn("Failed to retrieve stats server message", "err", err) + return + } + // If the network packet is a system ping, respond to it directly + var ping string + if err := json.Unmarshal(blob, &ping); err == nil && strings.HasPrefix(ping, "primus::ping::") { + if err := conn.WriteJSON(strings.Replace(ping, "ping", "pong", -1)); err != nil { + log.Warn("Failed to respond to system ping message", "err", err) + return + } + continue + } + // Not a system ping, try to decode an actual state message var msg map[string][]interface{} - if err := conn.ReadJSON(&msg); err != nil { + if err := json.Unmarshal(blob, &msg); err != nil { log.Warn("Failed to decode stats server message", "err", err) return }