fix: Avoid using hijacked http.ResponseWriter in workspaceAgentReportStats (#4165)

This commit is contained in:
Mathias Fredriksson
2022-09-23 19:08:56 +03:00
committed by GitHub
parent 7898581e50
commit 1e1967e0db

View File

@ -578,10 +578,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
if err == nil { if err == nil {
err = json.Unmarshal(latestStat.Payload, &lastReport) err = json.Unmarshal(latestStat.Payload, &lastReport)
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ api.Logger.Debug(ctx, "unmarshal stat payload", slog.Error(err))
Message: "Failed to unmarshal stat payload.", conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("unmarshal stat payload: %s", err))
Detail: err.Error(),
})
return return
} }
} }
@ -591,29 +589,23 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
for { for {
err := wsjson.Write(ctx, conn, codersdk.AgentStatsReportRequest{}) err := wsjson.Write(ctx, conn, codersdk.AgentStatsReportRequest{})
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ api.Logger.Debug(ctx, "write report request", slog.Error(err))
Message: "Failed to write report request.", conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("write report request: %s", err))
Detail: err.Error(),
})
return return
} }
var rep codersdk.AgentStatsReportResponse var rep codersdk.AgentStatsReportResponse
err = wsjson.Read(ctx, conn, &rep) err = wsjson.Read(ctx, conn, &rep)
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ api.Logger.Debug(ctx, "read report response", slog.Error(err))
Message: "Failed to read report response.", conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("read report response: %s", err))
Detail: err.Error(),
})
return return
} }
repJSON, err := json.Marshal(rep) repJSON, err := json.Marshal(rep)
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ api.Logger.Debug(ctx, "marshal stat json", slog.Error(err))
Message: "Failed to marshal stat json.", conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("marshal stat json: %s", err))
Detail: err.Error(),
})
return return
} }
@ -623,7 +615,7 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
// all. // all.
// We also don't want to update the workspace last used at on duplicate // We also don't want to update the workspace last used at on duplicate
// reports. // reports.
var updateDB = !reflect.DeepEqual(lastReport, rep) updateDB := !reflect.DeepEqual(lastReport, rep)
api.Logger.Debug(ctx, "read stats report", api.Logger.Debug(ctx, "read stats report",
slog.F("interval", api.AgentStatsRefreshInterval), slog.F("interval", api.AgentStatsRefreshInterval),
@ -649,10 +641,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
Payload: json.RawMessage(repJSON), Payload: json.RawMessage(repJSON),
}) })
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ api.Logger.Debug(ctx, "insert agent stat", slog.Error(err))
Message: "Failed to insert agent stat.", conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("insert agent stat: %s", err))
Detail: err.Error(),
})
return return
} }
@ -661,10 +651,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques
LastUsedAt: database.Now(), LastUsedAt: database.Now(),
}) })
if err != nil { if err != nil {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ api.Logger.Debug(ctx, "update workspace last used at", slog.Error(err))
Message: "Failed to update workspace last used at.", conn.Close(websocket.StatusInternalError, httpapi.WebsocketCloseSprintf("update workspace last used at: %s", err))
Detail: err.Error(),
})
return return
} }
} }