2026-04-01 14:45:19 +08:00
|
|
|
const filteredRequestHeaders = new Set([
|
2026-06-12 01:53:38 +03:00
|
|
|
// Client credentials for the OpenChamber server (UI client tokens) must
|
|
|
|
|
// never reach the managed OpenCode upstream — it only accepts its own auth,
|
|
|
|
|
// so a forwarded client bearer turns every upstream response into a 401.
|
|
|
|
|
'authorization',
|
2026-04-01 14:45:19 +08:00
|
|
|
'host',
|
|
|
|
|
'connection',
|
|
|
|
|
'content-length',
|
|
|
|
|
'transfer-encoding',
|
|
|
|
|
'keep-alive',
|
|
|
|
|
'te',
|
|
|
|
|
'trailer',
|
|
|
|
|
'upgrade',
|
|
|
|
|
'accept-encoding',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const filteredResponseHeaders = new Set([
|
|
|
|
|
'connection',
|
|
|
|
|
'content-length',
|
|
|
|
|
'transfer-encoding',
|
|
|
|
|
'keep-alive',
|
|
|
|
|
'te',
|
|
|
|
|
'trailer',
|
|
|
|
|
'upgrade',
|
|
|
|
|
'www-authenticate',
|
|
|
|
|
'content-encoding',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
export const collectForwardProxyHeaders = (requestHeaders, authHeaders = {}) => {
|
|
|
|
|
const headers = {};
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(requestHeaders || {})) {
|
|
|
|
|
if (!value) continue;
|
|
|
|
|
const normalizedKey = key.toLowerCase();
|
|
|
|
|
if (filteredRequestHeaders.has(normalizedKey)) continue;
|
|
|
|
|
headers[normalizedKey] = Array.isArray(value) ? value.join(', ') : String(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (authHeaders.Authorization) {
|
|
|
|
|
headers.Authorization = authHeaders.Authorization;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return headers;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const shouldForwardProxyResponseHeader = (key) => {
|
|
|
|
|
if (typeof key !== 'string' || key.trim().length === 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return !filteredResponseHeaders.has(key.toLowerCase());
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const applyForwardProxyResponseHeaders = (responseHeaders, response) => {
|
|
|
|
|
if (!responseHeaders || typeof response?.setHeader !== 'function') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of responseHeaders.entries()) {
|
|
|
|
|
if (!shouldForwardProxyResponseHeader(key)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
response.setHeader(key, value);
|
|
|
|
|
}
|
|
|
|
|
};
|