Skip to content

Commit 71bef4d

Browse files
authored
Merge branch 'master' into body-parser-test
2 parents f7bcdf9 + 1704875 commit 71bef4d

File tree

4 files changed

+63
-3
lines changed

4 files changed

+63
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [v1.2.1](https://github.com/chimurai/http-proxy-middleware/releases/tag/v1.2.1)
4+
5+
- fix(response interceptor): proxy original response headers ([#563](https://github.com/chimurai/http-proxy-middleware/pull/563))
6+
37
## [v1.2.0](https://github.com/chimurai/http-proxy-middleware/releases/tag/v1.2.0)
48

59
- feat(handler): response interceptor ([#520](https://github.com/chimurai/http-proxy-middleware/pull/520))

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "http-proxy-middleware",
3-
"version": "1.2.0",
3+
"version": "1.2.1",
44
"description": "The one-liner node.js proxy middleware for connect, express and browser-sync",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

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: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,32 @@ describe('responseInterceptor()', () => {
4141
});
4242
});
4343

44+
describe('intercept responses with original headers', () => {
45+
beforeEach(() => {
46+
agent = request(
47+
createApp(
48+
createProxyMiddleware({
49+
target: `http://httpbin.org`,
50+
changeOrigin: true, // for vhosted sites, changes host header to match to target's host
51+
selfHandleResponse: true,
52+
onProxyRes: responseInterceptor(async (responseBuffer, proxyRes, req, res) => {
53+
return responseBuffer;
54+
}),
55+
})
56+
)
57+
);
58+
});
59+
60+
it('should proxy and return original headers from http://httpbin.org/cookies/set/cookie/monster', async () => {
61+
return agent
62+
.get(`/cookies/set/cookie/monster`)
63+
.expect('Access-Control-Allow-Origin', '*')
64+
.expect('Date', /.+/)
65+
.expect('set-cookie', /.*cookie=monster.*/)
66+
.expect(302);
67+
});
68+
});
69+
4470
describe('intercept compressed responses', () => {
4571
beforeEach(() => {
4672
agent = request(

0 commit comments

Comments
 (0)