Skip to content

Commit 894b298

Browse files
fix: stop reading closed channel for /watch devcontainers endpoint
Fixes #19372 We increase the read limit to 4MiB (we use this limit elsewhere). We also make sure to stop sending messages of `containersCh` becomes closed.
1 parent a9f607a commit 894b298

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

coderd/workspaceagents.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,11 @@ func (api *API) watchWorkspaceAgentContainers(rw http.ResponseWriter, r *http.Re
896896
case <-ctx.Done():
897897
return
898898

899-
case containers := <-containersCh:
899+
case containers, ok := <-containersCh:
900+
if !ok {
901+
return
902+
}
903+
900904
if err := encoder.Encode(containers); err != nil {
901905
api.Logger.Error(ctx, "encode containers", slog.Error(err))
902906
return

codersdk/workspacesdk/agentconn.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ func (c *AgentConn) WatchContainers(ctx context.Context, logger slog.Logger) (<-
399399
url := fmt.Sprintf("http://%s%s", host, "/api/v0/containers/watch")
400400

401401
conn, res, err := websocket.Dial(ctx, url, &websocket.DialOptions{
402-
HTTPClient: c.apiClient(),
402+
HTTPClient: c.apiClient(),
403+
CompressionMode: websocket.CompressionContextTakeover,
403404
})
404405
if err != nil {
405406
if res == nil {
@@ -411,6 +412,8 @@ func (c *AgentConn) WatchContainers(ctx context.Context, logger slog.Logger) (<-
411412
defer res.Body.Close()
412413
}
413414

415+
conn.SetReadLimit(1 << 22) // 4MiB
416+
414417
d := wsjson.NewDecoder[codersdk.WorkspaceAgentListContainersResponse](conn, websocket.MessageText, logger)
415418
return d.Chan(), d, nil
416419
}

0 commit comments

Comments
 (0)