Skip to content

Commit 0c9d84c

Browse files
committed
fix(openrouter): bound media response reads
1 parent b7a9d30 commit 0c9d84c

2 files changed

Lines changed: 28 additions & 8 deletions

File tree

extensions/openrouter/video-generation-provider.test.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ describe("openrouter video generation provider", () => {
546546
provider: "openrouter",
547547
capability: "video",
548548
baseUrl: "https://custom.openrouter.test/api/v1",
549+
allowPrivateNetwork: false,
549550
request: requestOverrides,
550551
},
551552
);
@@ -672,11 +673,10 @@ describe("openrouter video generation provider", () => {
672673

673674
it("wraps non-JSON successful OpenRouter submit responses", async () => {
674675
postJsonRequestMock.mockResolvedValue({
675-
response: {
676-
json: async () => {
677-
throw new SyntaxError("Unexpected token < in JSON");
678-
},
679-
},
676+
response: new Response("<html></html>", {
677+
status: 200,
678+
headers: { "content-type": "text/html" },
679+
}),
680680
release: vi.fn(async () => {}),
681681
});
682682

@@ -691,6 +691,22 @@ describe("openrouter video generation provider", () => {
691691
).rejects.toThrow("OpenRouter video generation response malformed");
692692
});
693693

694+
it("bounds oversized successful OpenRouter submit responses", async () => {
695+
const oversized = releasedOversizedJsonStream();
696+
postJsonRequestMock.mockResolvedValue(oversized);
697+
698+
const provider = buildOpenRouterVideoGenerationProvider();
699+
await expect(
700+
provider.generateVideo({
701+
provider: "openrouter",
702+
model: "google/veo-3.1",
703+
prompt: "oversized body",
704+
cfg: {} as never,
705+
}),
706+
).rejects.toThrow("OpenRouter video generation: JSON response exceeds 16777216 bytes");
707+
expect(oversized.wasCanceled()).toBe(true);
708+
});
709+
694710
it("rejects unknown OpenRouter poll statuses without waiting for timeout", async () => {
695711
postJsonRequestMock.mockResolvedValue(
696712
releasedJson({

extensions/openrouter/video-generation-provider.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
assertOkOrThrowHttpError,
77
createProviderOperationDeadline,
88
postJsonRequest,
9+
readProviderJsonResponse,
910
resolveProviderHttpRequestConfig,
1011
resolveProviderOperationTimeoutMs,
1112
sanitizeConfiguredModelProviderRequest,
@@ -68,9 +69,12 @@ type OpenRouterFrameImagePart = OpenRouterImagePart & {
6869
async function readOpenRouterVideoJson(response: Response): Promise<Record<string, unknown>> {
6970
let payload: unknown;
7071
try {
71-
payload = await response.json();
72-
} catch {
73-
throw new Error(OPENROUTER_VIDEO_MALFORMED_RESPONSE);
72+
payload = await readProviderJsonResponse<unknown>(response, "OpenRouter video generation");
73+
} catch (error) {
74+
if (error instanceof Error && error.message.endsWith(": malformed JSON response")) {
75+
throw new Error(OPENROUTER_VIDEO_MALFORMED_RESPONSE, { cause: error });
76+
}
77+
throw error;
7478
}
7579
if (!isRecord(payload)) {
7680
throw new Error(OPENROUTER_VIDEO_MALFORMED_RESPONSE);

0 commit comments

Comments
 (0)