chimurai / http-proxy-middleware

:zap: The one-liner node.js http-proxy middleware for connect, express, next.js and more
MIT License
10.7k stars 834 forks source link

Errors in prepareProxyRequest not handled for websockets #822

Open nwalters512 opened 2 years ago

nwalters512 commented 2 years ago

Checks

Describe the bug (be clear and concise)

The callsites of handleUpgrade do not handle errors thrown from prepareProxyRequest. For a user, this means that any error thrown in router or pathRewrite will result in an unhandledRejection.

We can see that the two call sites for handleUpgrade neither await the returned promise, nor use .catch() to handle errors:

https://github.com/chimurai/http-proxy-middleware/blob/79c9885eb2b8ed1bc201182175b733b738873f5e/src/http-proxy-middleware.ts#L34

https://github.com/chimurai/http-proxy-middleware/blob/79c9885eb2b8ed1bc201182175b733b738873f5e/src/http-proxy-middleware.ts#L88

Step-by-step reproduction instructions

Add a router or pathRewrite function that throws an error, then try to make a websocket request. Observe that the error is not handled. E.g., if you add an onError handler to the proxy config, it is not called, and if you process.on('unhandledRejection', (e) => console.error(e)), that error is logged.

Expected behavior (be clear and concise)

onError should be invoked so that I can handle the error appropriately.

How is http-proxy-middleware used in your project?

It is installed as a direct dependency.

What http-proxy-middleware configuration are you using?

Here's a pared-down version:

const options = {
  router: async () => {
    throw new Error('testing');
  },
  onError: (err, req, res) => {
    // Not called for websocket requests
    res.status(500).send();
  },
};

What OS/version and node/version are you seeing the problem?

macOS 12.5.1; Node v16.17.0