Skip to content

Commit 2835447

Browse files
committed
fix(response interceptor): proxy original response headers
1 parent 017ac01 commit 2835447

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

src/handlers/response-interceptor.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ export function responseInterceptor(interceptor: Interceptor) {
3131
_proxyRes.on('data', (chunk) => (buffer = Buffer.concat([buffer, chunk])));
3232

3333
_proxyRes.on('end', async () => {
34-
// set original content type from upstream
35-
res.setHeader('content-type', originalProxyRes.headers['content-type'] || '');
34+
// copy original headers
35+
copyHeaders(proxyRes, res);
3636

3737
// call interceptor with intercepted response (buffer)
3838
const interceptedBuffer = Buffer.from(await interceptor(buffer, originalProxyRes, req, res));
@@ -79,3 +79,33 @@ function decompress(proxyRes: http.IncomingMessage, contentEncoding: string) {
7979

8080
return _proxyRes;
8181
}
82+
83+
/**
84+
* Copy original headers
85+
* https://github.com/apache/superset/blob/9773aba522e957ed9423045ca153219638a85d2f/superset-frontend/webpack.proxy-config.js#L78
86+
*/
87+
function copyHeaders(originalResponse, response) {
88+
response.statusCode = originalResponse.statusCode;
89+
response.statusMessage = originalResponse.statusMessage;
90+
91+
if (response.setHeader) {
92+
let keys = Object.keys(originalResponse.headers);
93+
94+
// ignore chunked, brotli, gzip, deflate headers
95+
keys = keys.filter((key) => !['content-encoding', 'transfer-encoding'].includes(key));
96+
97+
keys.forEach((key) => {
98+
let value = originalResponse.headers[key];
99+
100+
if (key === 'set-cookie') {
101+
// remove cookie domain
102+
value = Array.isArray(value) ? value : [value];
103+
value = value.map((x) => x.replace(/Domain=[^;]+?/i, ''));
104+
}
105+
106+
response.setHeader(key, value);
107+
});
108+
} else {
109+
response.headers = originalResponse.headers;
110+
}
111+
}

test/e2e/response-interceptor.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ describe('responseInterceptor()', () => {
3939
const response = await agent.get(`/json`).expect(200);
4040
expect(response.body.favorite).toEqual('叉燒包');
4141
});
42+
43+
it('should return proxy original headers from http://httpbin.org/json', async () => {
44+
const response = await agent
45+
.get(`/json`)
46+
.expect('Access-Control-Allow-Origin', '*')
47+
.expect('Date', /.+/)
48+
.expect(200);
49+
50+
expect(response.body.foo).toEqual('bar');
51+
});
4252
});
4353

4454
describe('intercept compressed responses', () => {

0 commit comments

Comments
 (0)