(ep Endpoint, reqURL string)
| 367 | } |
| 368 | |
| 369 | func execWebsocket(ep Endpoint, reqURL string) error { |
| 370 | wsURL := strings.Replace(reqURL, "http://", "ws://", 1) |
| 371 | wsURL = strings.Replace(wsURL, "https://", "wss://", 1) |
| 372 | if strings.ToUpper(ep.Method) != http.MethodGet { |
| 373 | return fmt.Errorf("--ws requires GET endpoint, got %s", ep.Method) |
| 374 | } |
| 375 | c, _, err := websocket.DefaultDialer.Dial(wsURL, nil) |
| 376 | if err != nil { |
| 377 | return err |
| 378 | } |
| 379 | defer c.Close() |
| 380 | |
| 381 | stopPing := make(chan struct{}) |
| 382 | defer close(stopPing) |
| 383 | go func() { |
| 384 | ticker := time.NewTicker(3 * time.Second) |
| 385 | defer ticker.Stop() |
| 386 | for { |
| 387 | select { |
| 388 | case <-stopPing: |
| 389 | return |
| 390 | case <-ticker.C: |
| 391 | _ = c.SetWriteDeadline(time.Now().Add(2 * time.Second)) |
| 392 | if err := c.WriteMessage(websocket.TextMessage, []byte("ping")); err != nil { |
| 393 | return |
| 394 | } |
| 395 | } |
| 396 | } |
| 397 | }() |
| 398 | |
| 399 | for { |
| 400 | _, msg, err := c.ReadMessage() |
| 401 | if err != nil { |
| 402 | if websocket.IsCloseError(err, websocket.CloseNormalClosure, websocket.CloseGoingAway) || strings.Contains(err.Error(), "close") { |
| 403 | return nil |
| 404 | } |
| 405 | return err |
| 406 | } |
| 407 | if string(msg) == "pong" { |
| 408 | continue |
| 409 | } |
| 410 | fmt.Println(string(msg)) |
| 411 | } |
| 412 | } |
| 413 | |
| 414 | func printJSON(payload []byte) { |
| 415 | if len(payload) == 0 { |
no test coverage detected