(ctx context.Context, logsRawURL string, filter string)
| 112 | } |
| 113 | |
| 114 | func Stream(ctx context.Context, logsRawURL string, filter string) error { |
| 115 | var ( |
| 116 | err error |
| 117 | event WSEvent |
| 118 | ) |
| 119 | |
| 120 | logsURL, err := url.Parse(logsRawURL) |
| 121 | if err != nil { |
| 122 | return errors.Wrapf(ctx, err, "parse logs URL %s", logsRawURL) |
| 123 | } |
| 124 | if logsURL.Scheme == "https" { |
| 125 | logsURL.Scheme = "wss" |
| 126 | } else { |
| 127 | logsURL.Scheme = "ws" |
| 128 | } |
| 129 | |
| 130 | logsURLString := logsURL.String() + "&stream=true" |
| 131 | if filter != "" { |
| 132 | logsURLString = fmt.Sprintf("%s&filter=%s", logsURLString, filter) |
| 133 | } |
| 134 | |
| 135 | header := http.Header{} |
| 136 | header.Add("Origin", "http://scalingo-cli.local/"+config.Version) |
| 137 | conn, resp, err := websocket.DefaultDialer.DialContext(ctx, logsURLString, header) |
| 138 | if err != nil { |
| 139 | return errors.Wrap(ctx, err, "open logs websocket stream") |
| 140 | } |
| 141 | defer resp.Body.Close() |
| 142 | |
| 143 | signals.CatchQuitSignals = false |
| 144 | signals := make(chan os.Signal, 1) |
| 145 | signal.Notify(signals, os.Interrupt) |
| 146 | |
| 147 | go func() { |
| 148 | defer close(signals) |
| 149 | <-signals |
| 150 | err := conn.Close() |
| 151 | if err != nil { |
| 152 | debug.Println("Fail to close log websocket connection", err) |
| 153 | } |
| 154 | }() |
| 155 | |
| 156 | for { |
| 157 | err := conn.ReadJSON(&event) |
| 158 | if err != nil { |
| 159 | conn.Close() |
| 160 | if err == stdio.EOF { |
| 161 | debug.Println("Remote server broke the connection, reconnecting") |
| 162 | for err != nil { |
| 163 | conn, resp, err = websocket.DefaultDialer.DialContext(ctx, logsURLString, header) |
| 164 | defer resp.Body.Close() |
| 165 | time.Sleep(time.Second * 1) |
| 166 | } |
| 167 | continue |
| 168 | } else if strings.Contains(err.Error(), "use of closed network connect") { |
| 169 | return nil |
| 170 | } else { |
| 171 | return errors.Wrap(ctx, err, "read logs event from websocket stream") |
no test coverage detected