Skip to content

Commit be99bc4

Browse files
authored
fix(proxy): close proxy when server closes (#508)
1 parent 7c3fd07 commit be99bc4

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

CHANGELOG.md

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

3+
## next
4+
5+
- fix(proxy): close proxy when server closes ([#508](https://github.com/chimurai/http-proxy-middleware/pull/508))
6+
- refactor(lodash): remove lodash ([#459](https://github.com/chimurai/http-proxy-middleware/pull/459)) ([#507](https://github.com/chimurai/http-proxy-middleware/pull/507)) ([TrySound](https://github.com/TrySound))
7+
- fix(ETIMEDOUT): return 504 on ETIMEDOUT ([#480](https://github.com/chimurai/http-proxy-middleware/pull/480)) ([aremishevsky](https://github.com/aremishevsky))
8+
39
## [v1.0.6](https://github.com/chimurai/http-proxy-middleware/releases/tag/v1.0.6)
410

511
- chore(deps): lodash 4.17.20 ([#475](https://github.com/chimurai/http-proxy-middleware/pull/475))

src/http-proxy-middleware.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as https from 'https';
12
import * as express from 'express';
23
import * as httpProxy from 'http-proxy';
34
import { createConfig } from './config-factory';
@@ -12,6 +13,7 @@ export class HttpProxyMiddleware {
1213
private logger = getInstance();
1314
private config;
1415
private wsInternalSubscribed = false;
16+
private serverOnCloseSubscribed = false;
1517
private proxyOptions: Options;
1618
private proxy: httpProxy;
1719
private pathRewriter;
@@ -58,13 +60,31 @@ export class HttpProxyMiddleware {
5860
next();
5961
}
6062

63+
/**
64+
* Get the server object to subscribe to server events;
65+
* 'upgrade' for websocket and 'close' for graceful shutdown
66+
*
67+
* NOTE:
68+
* req.socket: node >= 13
69+
* req.connection: node < 13 (Remove this when node 12/13 support is dropped)
70+
*/
71+
const server: https.Server = ((req.socket ?? req.connection) as any)?.server;
72+
73+
if (server && !this.serverOnCloseSubscribed) {
74+
server.on('close', () => {
75+
this.logger.info('[HPM] server close signal received: closing proxy server');
76+
this.proxy.close();
77+
});
78+
this.serverOnCloseSubscribed = true;
79+
}
80+
6181
if (this.proxyOptions.ws === true) {
6282
// use initial request to access the server object to subscribe to http upgrade event
63-
this.catchUpgradeRequest((req.connection as any).server);
83+
this.catchUpgradeRequest(server);
6484
}
6585
};
6686

67-
private catchUpgradeRequest = (server) => {
87+
private catchUpgradeRequest = (server: https.Server) => {
6888
if (!this.wsInternalSubscribed) {
6989
server.on('upgrade', this.handleUpgrade);
7090
// prevent duplicate upgrade handling;

test/e2e/express-router.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { createProxyMiddleware } from './_utils';
44
import { Options } from '../../src/index';
55

66
describe('Usage in Express', () => {
7-
let app;
8-
let server;
7+
let app: express.Express;
8+
let server: http.Server;
99

1010
beforeEach(() => {
1111
app = express();
@@ -46,6 +46,7 @@ describe('Usage in Express', () => {
4646
server = app.listen(3000);
4747
});
4848

49+
// FIXME: flaky e2e test; caused by fixed port:3000
4950
it('should still return a response when route does not match proxyConfig', (done) => {
5051
let responseBody;
5152
http.get('http://localhost:3000/sub/hello', (res) => {

test/e2e/http-proxy-middleware.spec.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -382,11 +382,12 @@ describe('E2E http-proxy-middleware', () => {
382382
});
383383

384384
describe('option.logLevel & option.logProvider', () => {
385-
let logMessage;
385+
let logMessages: string[];
386386

387387
beforeEach(() => {
388-
const customLogger = (message) => {
389-
logMessage = message;
388+
logMessages = [];
389+
const customLogger = (message: string) => {
390+
logMessages.push(message);
390391
};
391392

392393
agent = request(
@@ -406,9 +407,12 @@ describe('E2E http-proxy-middleware', () => {
406407
await mockTargetServer.get('/api/foo/bar').thenReply(200);
407408
await agent.get(`/api/foo/bar`).expect(200);
408409

409-
expect(logMessage).toMatchInlineSnapshot(
410-
`"[HPM] Proxy created: /api -> http://localhost:8000"`
411-
);
410+
expect(logMessages).toMatchInlineSnapshot(`
411+
Array [
412+
"[HPM] Proxy created: /api -> http://localhost:8000",
413+
"[HPM] server close signal received: closing proxy server",
414+
]
415+
`);
412416
});
413417
});
414418
});

0 commit comments

Comments
 (0)