MCPcopy Create free account
hub / github.com/Scalingo/cli / Stream

Function Stream

logs/logs.go:114–181  ·  view source on GitHub ↗
(ctx context.Context, logsRawURL string, filter string)

Source from the content-addressed store, hash-verified

112}
113
114func 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")

Callers 2

LogsFunction · 0.92
LogsFunction · 0.92

Calls 2

colorizeLogsFunction · 0.85
ErrorMethod · 0.80

Tested by

no test coverage detected