Skip to content

Commit 1e1967e

Browse files
authored
fix: Avoid using hijacked http.ResponseWriter in workspaceAgentReportStats (#4165)
1 parent 7898581 commit 1e1967e

File tree

1 file changed

+13
-25
lines changed

1 file changed

+13
-25
lines changed

coderd/workspaceagents.go

+13-25
Original file line numberDiff line numberDiff line change
@@ -578,10 +578,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
578578
if err == nil {
579579
err = json.Unmarshal(latestStat.Payload, &lastReport)
580580
if err != nil {
581-
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
582-
Message: "Failed to unmarshal stat payload.",
583-
Detail: err.Error(),
584-
})
581+
api.Logger.Debug(ctx, "unmarshal stat payload", slog.Error(err))
582+
conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("unmarshal stat payload: %s", err))
585583
return
586584
}
587585
}
@@ -591,29 +589,23 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
591589
for {
592590
err := wsjson.Write(ctx, conn, codersdk.AgentStatsReportRequest{})
593591
if err != nil {
594-
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
595-
Message: "Failed to write report request.",
596-
Detail: err.Error(),
597-
})
592+
api.Logger.Debug(ctx, "write report request", slog.Error(err))
593+
conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("write report request: %s", err))
598594
return
599595
}
600596
var rep codersdk.AgentStatsReportResponse
601597

602598
err = wsjson.Read(ctx, conn, &rep)
603599
if err != nil {
604-
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
605-
Message: "Failed to read report response.",
606-
Detail: err.Error(),
607-
})
600+
api.Logger.Debug(ctx, "read report response", slog.Error(err))
601+
conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("read report response: %s", err))
608602
return
609603
}
610604

611605
repJSON, err := json.Marshal(rep)
612606
if err != nil {
613-
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
614-
Message: "Failed to marshal stat json.",
615-
Detail: err.Error(),
616-
})
607+
api.Logger.Debug(ctx, "marshal stat json", slog.Error(err))
608+
conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("marshal stat json: %s", err))
617609
return
618610
}
619611

@@ -623,7 +615,7 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
623615
// all.
624616
// We also don't want to update the workspace last used at on duplicate
625617
// reports.
626-
var updateDB = !reflect.DeepEqual(lastReport, rep)
618+
updateDB := !reflect.DeepEqual(lastReport, rep)
627619

628620
api.Logger.Debug(ctx, "read stats report",
629621
slog.F("interval", api.AgentStatsRefreshInterval),
@@ -649,10 +641,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
649641
Payload: json.RawMessage(repJSON),
650642
})
651643
if err != nil {
652-
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
653-
Message: "Failed to insert agent stat.",
654-
Detail: err.Error(),
655-
})
644+
api.Logger.Debug(ctx, "insert agent stat", slog.Error(err))
645+
conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("insert agent stat: %s", err))
656646
return
657647
}
658648

@@ -661,10 +651,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
661651
LastUsedAt: database.Now(),
662652
})
663653
if err != nil {
664-
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
665-
Message: "Failed to update workspace last used at.",
666-
Detail: err.Error(),
667-
})
654+
api.Logger.Debug(ctx, "update workspace last used at", slog.Error(err))
655+
conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("update workspace last used at: %s", err))
668656
return
669657
}
670658
}

0 commit comments

Comments
 (0)