From 48c322d7254c5e8dd0214a6ed85e91b94839656f Mon Sep 17 00:00:00 2001 From: Masonlet Date: Tue, 9 Jun 2026 17:02:31 -0400 Subject: [PATCH] fix: return HTTP 200 for error SVGs --- api/languages/index.ts | 5 ++++- tests/api/languages/index.test.ts | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/api/languages/index.ts b/api/languages/index.ts index 97dcb56..9d4c286 100644 --- a/api/languages/index.ts +++ b/api/languages/index.ts @@ -25,8 +25,11 @@ export default async function handler( res.setHeader("Cache-Control", "public, max-age=3600, s-maxage=3600, stale-while-revalidate=60"); res.status(200).send(svg); } catch (error) { + console.error("[api/languages]", error); const errorSvg = renderError((error as Error).message, width, height, selectedTheme); res.setHeader("Content-Type", "image/svg+xml"); - res.status(500).send(errorSvg); + res.setHeader("Cache-Control", "no-store"); + res.setHeader("X-Chart-Error", "true"); + res.status(200).send(errorSvg); // Return 200 so error SVGs render in GitHub README embeds (camo proxy drops non-200 bodies) } } diff --git a/tests/api/languages/index.test.ts b/tests/api/languages/index.test.ts index 2ecc208..ae24dff 100644 --- a/tests/api/languages/index.test.ts +++ b/tests/api/languages/index.test.ts @@ -85,7 +85,9 @@ describe("handler", () => { expect(renderError).toHaveBeenCalledWith("GitHub API error", 600, 400, mockTheme); expect(res.setHeader).toHaveBeenCalledWith("Content-Type", "image/svg+xml"); - expect(res.status).toHaveBeenCalledWith(500); + expect(res.setHeader).toHaveBeenCalledWith("Cache-Control", "no-store"); + expect(res.setHeader).toHaveBeenCalledWith("X-Chart-Error", "true"); + expect(res.status).toHaveBeenCalledWith(200); expect(res.send).toHaveBeenCalledWith(errorSvg); }); @@ -100,6 +102,8 @@ describe("handler", () => { await handler(req, res); expect(renderError).toHaveBeenCalledWith("No language data available", 600, 400, mockTheme); - expect(res.status).toHaveBeenCalledWith(500); + expect(res.setHeader).toHaveBeenCalledWith("Cache-Control", "no-store"); + expect(res.setHeader).toHaveBeenCalledWith("X-Chart-Error", "true"); + expect(res.status).toHaveBeenCalledWith(200); }); });