package handlers import ( "log" "net/http" "net/url" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/nemunaire/repeater/internal/logging" ) var upgrader = websocket.Upgrader{ CheckOrigin: checkSameOrigin, } // checkSameOrigin only accepts WebSocket upgrades whose Origin header matches // the request's Host. Without this, any web page a LAN user visits could open // a WebSocket against the router's API. func checkSameOrigin(r *http.Request) bool { origin := r.Header.Get("Origin") if origin == "" { // Non-browser clients (curl, native apps) do not send Origin. return true } u, err := url.Parse(origin) if err != nil { return false } return u.Host == r.Host } // WebSocketLogs handles WebSocket connections for real-time logs func WebSocketLogs(c *gin.Context) { conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { log.Printf("Erreur WebSocket: %v", err) return } defer conn.Close() // Register client logging.RegisterWebSocketClient(conn) defer logging.UnregisterWebSocketClient(conn) // Keep connection alive for { _, _, err := conn.ReadMessage() if err != nil { break } } }