proxy_ws.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package middleware
  2. import (
  3. "net/http"
  4. "github.com/0xJacky/Nginx-UI/query"
  5. "github.com/gin-gonic/gin"
  6. "github.com/pretty66/websocketproxy"
  7. "github.com/spf13/cast"
  8. "github.com/uozi-tech/cosy/logger"
  9. )
  10. func ProxyWs() gin.HandlerFunc {
  11. return func(c *gin.Context) {
  12. nodeID, ok := c.Get("ProxyNodeID")
  13. if !ok {
  14. c.Next()
  15. return
  16. }
  17. id := cast.ToUint64(nodeID)
  18. if id == 0 {
  19. c.Next()
  20. return
  21. }
  22. defer c.Abort()
  23. env := query.Environment
  24. environment, err := env.Where(env.ID.Eq(id)).First()
  25. if err != nil {
  26. logger.Error(err)
  27. return
  28. }
  29. decodedUri, err := environment.GetWebSocketURL(c.Request.RequestURI)
  30. if err != nil {
  31. logger.Error(err)
  32. return
  33. }
  34. logger.Debug("Proxy request", decodedUri)
  35. wp, err := websocketproxy.NewProxy(decodedUri, func(r *http.Request) error {
  36. r.Header.Set("X-Node-Secret", environment.Token)
  37. r.Header.Del("X-Node-ID")
  38. queryValues := r.URL.Query()
  39. queryValues.Del("x_node_id")
  40. r.URL.RawQuery = queryValues.Encode()
  41. return nil
  42. })
  43. if err != nil {
  44. logger.Error(err)
  45. return
  46. }
  47. wp.Proxy(c.Writer, c.Request)
  48. }
  49. }