proxy_ws.go 984 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package middleware
  2. import (
  3. "github.com/uozi-tech/cosy/logger"
  4. "github.com/0xJacky/Nginx-UI/query"
  5. "github.com/gin-gonic/gin"
  6. "github.com/pretty66/websocketproxy"
  7. "github.com/spf13/cast"
  8. "net/http"
  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.ToInt(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. return nil
  38. })
  39. if err != nil {
  40. logger.Error(err)
  41. return
  42. }
  43. wp.Proxy(c.Writer, c.Request)
  44. }
  45. }