From 4436cd655f71103bf976aa64a773013348d344fa Mon Sep 17 00:00:00 2001 From: Marko Djordjevic Date: Wed, 18 Feb 2026 11:21:21 +0100 Subject: [PATCH] fix: add response.ok checks before .json() in page.tsx fetch calls Guard all four fetch() calls in src/app/page.tsx against non-2xx HTTP responses by throwing before attempting to parse the body as JSON. Affected functions: fetchCharts, fetchAnnotations, fetchSpanAnnotations, fetchSpanLabelTypes. Marks task 4.11 as completed in code-review-fix/tasks.md. Co-Authored-By: Claude Sonnet 4.6 --- openspec/changes/code-review-fix/tasks.md | 2 +- src/app/page.tsx | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/openspec/changes/code-review-fix/tasks.md b/openspec/changes/code-review-fix/tasks.md index ba9a79d..ec2d8e6 100644 --- a/openspec/changes/code-review-fix/tasks.md +++ b/openspec/changes/code-review-fix/tasks.md @@ -36,7 +36,7 @@ - [x] 4.8 `[sonnet]` Wrap chart cascade delete in `db.transaction()` and add `spanAnnotations` deletion in `src/app/api/charts/[id]/route.ts` - [x] 4.9 `[haiku]` Add `parseInt(value, 10)` with `isNaN()` guard to all routes parsing integer query params - [x] 4.10 `[sonnet]` Add CSV injection protection (prefix `=+@-` cells with `'`) to all export routes -- [ ] 4.11 `[sonnet]` Add `response.ok` checks before `.json()` in `src/app/page.tsx` (lines 214, 230, 245, 257) +- [x] 4.11 `[sonnet]` Add `response.ok` checks before `.json()` in `src/app/page.tsx` (lines 214, 230, 245, 257) - [ ] 4.12 `[sonnet]` Add `response.ok` checks before `.json()` in `src/components/CandleChart.tsx` (lines 163, 178, 192) ## 5. ML Service Hardening (Python) diff --git a/src/app/page.tsx b/src/app/page.tsx index 6ea49c1..87e8f2c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -211,6 +211,7 @@ export default function Home() { const fetchCharts = useCallback(async () => { try { const response = await fetch('/api/charts'); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); setCharts(data); return data as Chart[]; @@ -228,6 +229,7 @@ export default function Home() { } try { const response = await fetch(`/api/annotations?chartId=${chartId}`); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); setAnnotations(data); } catch (error) { @@ -243,6 +245,7 @@ export default function Home() { } try { const response = await fetch(`/api/span-annotations?chartId=${chartId}`); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); setSpanAnnotations(data); } catch (error) { @@ -254,6 +257,7 @@ export default function Home() { const fetchSpanLabelTypes = useCallback(async () => { try { const response = await fetch('/api/span-label-types'); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); setSpanLabelTypes(data); } catch (error) {