Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • C create-react-app
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 1,547
    • Issues 1,547
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 417
    • Merge requests 417
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Meta
  • create-react-app
  • Issues
  • #13028
Closed
Open
Issue created Feb 21, 2023 by Administrator@rootContributor

Update documentation for proxy setup with respect for websocket connections

Created by: dselgo

Is your proposal related to a problem?

The documentation for Configuring the Proxy Manually provides an example on how to setup a proxy by using the express server's app.use path parameter to match requests.

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(
    '/api',
    createProxyMiddleware({
      target: 'http://localhost:5000',
      changeOrigin: true,
    })
  );
};

The problem is that express is configured for http/https and not ws/wss, so it doesn't work for proxying websocket connections. However, by providing the proxy path to http-proxy-middleware createProxyMiddleware instead, the websocket can be proxied just fine:

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
  app.use(createProxyMiddleware('/api', {
      target: 'http://localhost:5000',
      changeOrigin: true,
    })
  );
};

Describe the solution you'd like

I would like to see the documentation for Configuring the Proxy Manually to be changed so that the proxy path is passed to createProxyMiddleware rather than app.use. As far as I am aware, this shouldn't be any different for http/https proxies, but should also work for ws/wss proxies.

Or, at the very least, add a section on creating proxies for websockets.

Describe alternatives you've considered

When I was working on this issue, I did try the External WebSocket upgrade solution provided by http-proxy-middleware, and while it did proxy the websocket request correctly, I also kept receiving WebSocket connection to 'ws://localhost:3000/ws' failed errors in my console. I think this has to do with webpack's hot reload feature, but I'm by no means an expert in this area.

Additional context

Normally I wouldn't bring up such a small issue, but truth be told I was stuck on this for a week. I'm not an expert in CRA, Webpack, or proxies, so I had to rely on a lot of online documentation to try and figure out how to get this to work. I did have a working example of a websocket proxy from our legacy React app that used the proxy() function from http-proxy-middleware, but it was created over 5 years ago and CRA had been ejected, so that solution wasn't working.

I got to the point of ejecting CRA to try and work out that solution, and it led me to this SO comment which showed me that I could just pass the path parameter directly to createProxyMiddleware instead of app.use.

It was frustrating that the solution to my problem was that the path parameter just needed to be shifted over to the next function. I'm hoping that updating the documentation will be able to save time for the next person.

Assignee
Assign to
Time tracking