fix(chatcore): stop leaking provider credentials in response headers

Remove upstream provider headers from non-stream chatCore JSON responses to
prevent authorization and API key values from being exposed to clients.

Add coverage to verify sensitive provider request headers are omitted while
OmniRoute metadata headers remain present.
This commit is contained in:
diegosouzapw
2026-05-10 21:16:52 -03:00
parent 40bd60959e
commit ee408653dd
2 changed files with 19 additions and 1 deletions

View File

@@ -4200,7 +4200,6 @@ export async function handleChatCore({
success: true,
response: new Response(JSON.stringify(translatedResponse), {
headers: {
...Object.fromEntries(providerHeaders.entries()),
"Content-Type": "application/json",
[OMNIROUTE_RESPONSE_HEADERS.cache]: "MISS",
...buildOmniRouteResponseMetaHeaders({

View File

@@ -1354,6 +1354,25 @@ test("chatCore attaches OmniRoute response metadata headers to non-stream respon
assert.match(String(result.response.headers.get("X-OmniRoute-Response-Cost")), /^\d+\.\d{10}$/);
});
test("chatCore does not expose provider request credentials in non-stream response headers", async () => {
const { result } = await invokeChatCore({
provider: "openai",
model: "gpt-4o-mini",
body: {
model: "gpt-4o-mini",
stream: false,
messages: [{ role: "user", content: "hide provider credentials" }],
},
responseFormat: "openai",
});
assert.equal(result.success, true);
assert.equal(result.response.headers.get("authorization"), null);
assert.equal(result.response.headers.get("x-api-key"), null);
assert.equal(result.response.headers.get("Content-Type"), "application/json");
assert.equal(result.response.headers.get("X-OmniRoute-Cache"), "MISS");
});
test("chatCore normalizes tool finish reasons and estimates usage when upstream omits it", async () => {
const { result } = await invokeChatCore({
provider: "openai",