From a3c7bbed44c57010f66df7ca65e075b2a62e6402 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 20 Oct 2025 19:36:01 +0300 Subject: [PATCH] socket fix --- configs/routes.json | 8 ++++++++ internal/middleware/middleware.go | 25 +++++++++++++++++-------- internal/proxy/handler.go | 7 ++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/configs/routes.json b/configs/routes.json index 0e335ed..4a2bc3d 100644 --- a/configs/routes.json +++ b/configs/routes.json @@ -60,6 +60,14 @@ "allow_untrusted": false } ], + "/socket.io": [ + { + "url": "https://yobble-socket-service", + "role": "master", + "yobble_signed": true, + "allow_untrusted": false + } + ], "/test": [ { "url": "https://localhost:9097", diff --git a/internal/middleware/middleware.go b/internal/middleware/middleware.go index 4c0b183..5f7dbbf 100644 --- a/internal/middleware/middleware.go +++ b/internal/middleware/middleware.go @@ -56,16 +56,25 @@ func GetRealIP(r *http.Request) string { // RemoveTrailingSlashMiddleware перенаправляет запросы с завершающим слэшем (если это не просто '/') // на тот же путь без завершающего слэша. func RemoveTrailingSlashMiddleware(next http.Handler) http.Handler { - op := "middleware.RemoveTrailingSlashMiddleware" - log := logger.NewLoggerWithOp(op) + op := "middleware.RemoveTrailingSlashMiddleware" + log := logger.NewLoggerWithOp(op) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - urlPath := r.URL.Path + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + urlPath := r.URL.Path - if urlPath != "" && urlPath != "/" && strings.HasSuffix(urlPath, "/") { - newPath := strings.TrimSuffix(urlPath, "/") - newURL := *r.URL - newURL.Path = newPath + // Skip redirect for Socket.IO and WebSocket upgrade traffic + // Socket.IO may rely on a trailing slash in polling endpoints. + if strings.HasPrefix(urlPath, "/socket.io") || strings.HasPrefix(urlPath, "/ws/socket.io") || + strings.EqualFold(r.Header.Get("Upgrade"), "websocket") || + strings.Contains(strings.ToLower(r.Header.Get("Connection")), "upgrade") { + next.ServeHTTP(w, r) + return + } + + if urlPath != "" && urlPath != "/" && strings.HasSuffix(urlPath, "/") { + newPath := strings.TrimSuffix(urlPath, "/") + newURL := *r.URL + newURL.Path = newPath log.Debug("redirecting trailing slash", slog.String("old_path", urlPath), slog.String("new_path", newPath)) http.Redirect(w, r, newURL.String(), http.StatusMovedPermanently) return diff --git a/internal/proxy/handler.go b/internal/proxy/handler.go index 37c5581..fcb375e 100644 --- a/internal/proxy/handler.go +++ b/internal/proxy/handler.go @@ -9,6 +9,7 @@ import ( "net/http/httputil" "net/url" "os" + "strings" "yobble-gateway-go/internal/config" "yobble-gateway-go/internal/logger" @@ -58,7 +59,11 @@ func NewProxyHandler(cfg *config.Settings, geoIPService *geoip.GeoIPService) htt originalDirector(req) // Устанавливает базовые заголовки и URL // Устанавливаем правильный путь для бэкенда - req.URL.Path = tailPath + if strings.HasPrefix(r.URL.Path, "/socket.io") { + req.URL.Path = r.URL.Path + } else { + req.URL.Path = tailPath + } // Устанавливаем заголовки для информирования бэкенда об исходном запросе req.Header.Set("X-Real-IP", realIP)