handler.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package kvmhid
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "strings"
  8. "github.com/gorilla/websocket"
  9. )
  10. // upgrader is used to upgrade HTTP connections to WebSocket connections
  11. var upgrader = websocket.Upgrader{
  12. ReadBufferSize: 1024,
  13. WriteBufferSize: 1024,
  14. CheckOrigin: func(r *http.Request) bool {
  15. return true
  16. },
  17. }
  18. // HIDWebSocketHandler handles incoming WebSocket connections for HID commands
  19. func (c *Controller) HIDWebSocketHandler(w http.ResponseWriter, r *http.Request) {
  20. conn, err := upgrader.Upgrade(w, r, nil)
  21. if err != nil {
  22. log.Println("Failed to upgrade to websocket:", err)
  23. return
  24. }
  25. defer conn.Close()
  26. for {
  27. _, message, err := conn.ReadMessage()
  28. if err != nil {
  29. log.Println("Error reading message:", err)
  30. break
  31. }
  32. //Try parsing the message as a HIDCommand
  33. var hidCmd HIDCommand
  34. if err := json.Unmarshal(message, &hidCmd); err != nil {
  35. log.Println("Error parsing message:", err)
  36. continue
  37. }
  38. bytes, err := c.ConstructAndSendCmd(&hidCmd)
  39. if err != nil {
  40. errmsg := map[string]string{"error": err.Error()}
  41. if err := conn.WriteJSON(errmsg); err != nil {
  42. // Check for broken pipe error to handle closed websocket
  43. if err != nil && strings.Contains(err.Error(), "broken pipe") {
  44. log.Println("WebSocket connection closed (broken pipe), cleaning up")
  45. break
  46. }
  47. log.Println("Error writing message:", err)
  48. continue
  49. }
  50. log.Println("Error sending command:", err)
  51. continue
  52. }
  53. prettyBytes := ""
  54. for _, b := range bytes {
  55. prettyBytes += fmt.Sprintf("0x%02X ", b)
  56. }
  57. if err := conn.WriteMessage(websocket.TextMessage, []byte(prettyBytes)); err != nil {
  58. if err != nil && strings.Contains(err.Error(), "broken pipe") {
  59. log.Println("WebSocket connection closed (broken pipe), cleaning up")
  60. break
  61. }
  62. log.Println("Error writing message:", err)
  63. continue
  64. }
  65. }
  66. }