diff --git a/extensions/github-copilot/models.test.ts b/extensions/github-copilot/models.test.ts index ae2676adb362..23f9d90e0799 100644 --- a/extensions/github-copilot/models.test.ts +++ b/extensions/github-copilot/models.test.ts @@ -242,6 +242,22 @@ describe("fetchCopilotUsage", () => { expect(result.windows).toHaveLength(0); }); + it("cancels failed response bodies", async () => { + let canceled = false; + const body = new ReadableStream({ + cancel() { + canceled = true; + throw new Error("stream already closed"); + }, + }); + const mockFetch = createProviderUsageFetch(async () => new Response(body, { status: 500 })); + + const result = await fetchCopilotUsage("token", 5000, mockFetch); + + expect(result.error).toBe("HTTP 500"); + expect(canceled).toBe(true); + }); + it("parses premium/chat usage from remaining percentages", async () => { const mockFetch = createProviderUsageFetch(async (_url, init) => { const headers = (init?.headers as Record | undefined) ?? {}; diff --git a/extensions/github-copilot/usage.ts b/extensions/github-copilot/usage.ts index e218e53ff391..e968d3b4019f 100644 --- a/extensions/github-copilot/usage.ts +++ b/extensions/github-copilot/usage.ts @@ -38,6 +38,7 @@ export async function fetchCopilotUsage( ); if (!res.ok) { + await res.body?.cancel().catch(() => undefined); return buildUsageHttpErrorSnapshot({ provider: "github-copilot", status: res.status,