handler.go 1.5 KB

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