Files

66 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

const filteredRequestHeaders = new Set([
// 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',
'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);
}
};