Skip to content

Commit

Permalink
fix(response interceptor): proxy original response headers
Browse files Browse the repository at this point in the history
  • Loading branch information
chimurai committed Apr 24, 2021
1 parent 017ac01 commit 2835447
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
34 changes: 32 additions & 2 deletions src/handlers/response-interceptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ export function responseInterceptor(interceptor: Interceptor) {
_proxyRes.on('data', (chunk) => (buffer = Buffer.concat([buffer, chunk])));

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

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

return _proxyRes;
}

/**
* Copy original headers
* https:/apache/superset/blob/9773aba522e957ed9423045ca153219638a85d2f/superset-frontend/webpack.proxy-config.js#L78
*/
function copyHeaders(originalResponse, response) {
response.statusCode = originalResponse.statusCode;
response.statusMessage = originalResponse.statusMessage;

if (response.setHeader) {
let keys = Object.keys(originalResponse.headers);

// ignore chunked, brotli, gzip, deflate headers
keys = keys.filter((key) => !['content-encoding', 'transfer-encoding'].includes(key));

keys.forEach((key) => {
let value = originalResponse.headers[key];

if (key === 'set-cookie') {
// remove cookie domain
value = Array.isArray(value) ? value : [value];
value = value.map((x) => x.replace(/Domain=[^;]+?/i, ''));
}

response.setHeader(key, value);
});
} else {
response.headers = originalResponse.headers;
}
}
10 changes: 10 additions & 0 deletions test/e2e/response-interceptor.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,16 @@ describe('responseInterceptor()', () => {
const response = await agent.get(`/json`).expect(200);
expect(response.body.favorite).toEqual('叉燒包');
});

it('should return proxy original headers from http://httpbin.org/json', async () => {
const response = await agent
.get(`/json`)
.expect('Access-Control-Allow-Origin', '*')
.expect('Date', /.+/)
.expect(200);

expect(response.body.foo).toEqual('bar');
});
});

describe('intercept compressed responses', () => {
Expand Down

0 comments on commit 2835447

Please sign in to comment.