commit f252a4933f359eb32ccfaf3956918fc699f1c5a1 Author: Vladimir Zagainov Date: Sat Jun 14 20:11:47 2025 +0300 feat: implement websocket echo server diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..fb83bbf --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module gitea.mrixs.me/minecraft-platform/ping-helper + +go 1.24.1 + +require github.com/gorilla/websocket v1.5.3 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..25a9fc4 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/main.go b/main.go new file mode 100644 index 0000000..d7aab1e --- /dev/null +++ b/main.go @@ -0,0 +1,62 @@ +// File: ping-helper/main.go +package main + +import ( + "log" + "net/http" + + "github.com/gorilla/websocket" +) + +// upgrader "проапгрейдит" обычный HTTP-запрос до постоянного WebSocket-соединения. +var upgrader = websocket.Upgrader{ + // CheckOrigin позволяет нам контролировать, с каких доменов можно подключаться. + // Для простоты мы разрешим все подключения, так как Caddy будет нашим фронтом. + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// handleConnections - это обработчик для каждого нового WebSocket-соединения. +func handleConnections(w http.ResponseWriter, r *http.Request) { + // Апгрейдим HTTP до WebSocket + ws, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("error upgrading connection: %v", err) + return + } + // Важно закрыть соединение, когда функция завершится + defer ws.Close() + + log.Println("Client connected") + + // Бесконечный цикл для чтения сообщений от клиента + for { + // Читаем сообщение. Нам не важен тип, только содержимое (p). + _, p, err := ws.ReadMessage() + if err != nil { + // Если клиент закрыл соединение, будет ошибка, это нормально. + log.Printf("error reading message: %v", err) + break // Выходим из цикла, что приведет к закрытию соединения + } + + // Отправляем полученное сообщение обратно клиенту (эхо) + if err := ws.WriteMessage(websocket.TextMessage, p); err != nil { + log.Printf("error writing message: %v", err) + break + } + } + log.Println("Client disconnected") +} + +func main() { + // Регистрируем наш обработчик для пути /ws/ping + // Caddy будет проксировать запросы с platform.mrixs.me/ws/ping на этот путь. + http.HandleFunc("/ws/ping", handleConnections) + + // Запускаем сервер на порту 8081, как мы указали в Caddyfile + log.Println("Starting ping-helper server on :8081") + if err := http.ListenAndServe(":8081", nil); err != nil { + log.Fatalf("Failed to start server: %v", err) + } +}