Skip to content

Commit

Permalink
Merge branch 'master' into body-parser-test
Browse files Browse the repository at this point in the history
  • Loading branch information
chimurai authored Apr 24, 2021
2 parents f7bcdf9 + 1704875 commit 71bef4d
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [v1.2.1](https://github.com/chimurai/http-proxy-middleware/releases/tag/v1.2.1)

- fix(response interceptor): proxy original response headers ([#563](https://github.com/chimurai/http-proxy-middleware/pull/563))

## [v1.2.0](https://github.com/chimurai/http-proxy-middleware/releases/tag/v1.2.0)

- feat(handler): response interceptor ([#520](https://github.com/chimurai/http-proxy-middleware/pull/520))
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "http-proxy-middleware",
"version": "1.2.0",
"version": "1.2.1",
"description": "The one-liner node.js proxy middleware for connect, express and browser-sync",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
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://github.com/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;
}
}
26 changes: 26 additions & 0 deletions test/e2e/response-interceptor.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,32 @@ describe('responseInterceptor()', () => {
});
});

describe('intercept responses with original headers', () => {
beforeEach(() => {
agent = request(
createApp(
createProxyMiddleware({
target: `http://httpbin.org`,
changeOrigin: true, // for vhosted sites, changes host header to match to target's host
selfHandleResponse: true,
onProxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
return responseBuffer;
}),
})
)
);
});

it('should proxy and return original headers from http://httpbin.org/cookies/set/cookie/monster', async () => {
return agent
.get(`/cookies/set/cookie/monster`)
.expect('Access-Control-Allow-Origin', '*')
.expect('Date', /.+/)
.expect('set-cookie', /.*cookie=monster.*/)
.expect(302);
});
});

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

0 comments on commit 71bef4d

Please sign in to comment.