pty.go 882 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package api
  2. import (
  3. "github.com/0xJacky/Nginx-UI/logger"
  4. "github.com/0xJacky/Nginx-UI/server/internal/pty"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gorilla/websocket"
  7. "net/http"
  8. )
  9. func Pty(c *gin.Context) {
  10. var upGrader = websocket.Upgrader{
  11. CheckOrigin: func(r *http.Request) bool {
  12. return true
  13. },
  14. }
  15. // upgrade http to websocket
  16. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  17. if err != nil {
  18. logger.Error(err)
  19. return
  20. }
  21. defer ws.Close()
  22. p, err := pty.NewPipeLine(ws)
  23. if err != nil {
  24. logger.Error(err)
  25. return
  26. }
  27. defer p.Pty.Close()
  28. errorChan := make(chan error, 1)
  29. go p.ReadPtyAndWriteWs(errorChan)
  30. go p.ReadWsAndWritePty(errorChan)
  31. err = <-errorChan
  32. if err != nil && websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseNoStatusReceived,
  33. websocket.CloseNormalClosure) {
  34. logger.Error(err)
  35. }
  36. return
  37. }