Socket.io fermé avant de recevoir une réponse de négociation après un proxy

Je programme un gestionnaire de tâches pour les applications node.js. Ces applications sont ouvertes dans un port arbitraire, donc, pour les atteindre, je veux simuler leur racine dans une URL comme celle-ci:

http://domain.com/proxy/yourApplication

Ainsi, des tiers pourraient envoyer des requêtes HTTP à leur application sans savoir dans quel port il s’exécutait.

Puis j’ai choisi http-proxy :

 var express = require('express') , router = express.Router() , Helper = require('../helper') , launcher = require('../launcher') , httpProxy = require('http-proxy') , proxy = httpProxy.createProxyServer({ws: true}); 

Et le code qui écoute sur cette route …

 // Proxy router.use('/proxy/:name?', function(req, res) { var app, reqPath, referer, proxyUrl; // Capture the referer to proxy the request // in case the path is not clear enaugh if (req.get('referer') !== undefined) { var aux = req.get('referer').split('/'); referer = aux[aux.indexOf('proxy') + 1] } // This block returns an app object // with the port where it is running app = launcher.getApp(req.params.name) || launcher.getApp(referer); if (app) { // Here app is running // In case the path is /proxy/:name // instead of /proxy/:name/ you need this block req.url = (req.url === '/') ? '' : req.url; reqPath = (referer !== undefined) ? '/' + req.params.name + req.url : req.url; req.url = reqPath.replace('/proxy/', '/'); req.url = req.url.replace('/' + app.name, ''); // This block of code actually pipes the request // to the running app and pass it to the client proxyUrl = req.protocol + '://localhost:' + app.port; proxy.web(req, res, { target: proxyUrl }); // Some logging console.log('req url: %s', req.url); console.log('proxy url: %s', proxyUrl); console.log('referer: %s', referer); } else { // Here app is not running res.status(404).json("App not running"); } }); 

Cela fonctionne très bien avec la plupart des applications, mais lors de l’ouverture d’une application avec socket.io, il est indiqué:

 WebSocket connection to 'ws://localhost/proxy/xy-terminal/socket.io/1/websocket/gMqK_XRwZENuUibi4ekJ' failed: Connection closed before receiving a handshake response 

Dans la console du serveur …

 Trace: { [Error: socket hang up] code: 'ECONNRESET' } at process. (/Users/jdario/Development/xy-dashboard/www:107:11) at process.emit (events.js:107:17) at process._fatalException (node.js:236:26) at ProxyServer.emit (/Users/jdario/Development/xy-dashboard/node_modules/http-proxy/node_modules/eventemitter3/index.js:75:35) at ClientRequest.proxyError (/Users/jdario/Development/xy-dashboard/node_modules/http-proxy/lib/http-proxy/passes/web-incoming.js:140:16) at ClientRequest.emit (events.js:129:20) at Socket.socketCloseListener (_http_client.js:247:9) at Socket.emit (events.js:129:20) at TCP.close (net.js:485:12) 

Puisqu’il s’agit d’un “proxy” qui simule une racine d’application, je ne suis peut-être pas disponible pour modifier son code source individuellement, ils doivent simplement fonctionner comme prévu. En les ouvrant dans le bon port (3000 dans ce cas), ils ne montrent aucune erreur.

Merci d’avance!

La réponse la plus courte était en effet de modifier individuellement le code source des applications mandatées. Alors maintenant, ils utilisent

var io = require('socket.io')(http, { path: '/proxy/yourApplication'})

Cet article a abordé le problème. https://stackoverflow.com/a/31658307/2633577

Cependant, cette réponse n’est pas la meilleure car elle n’est pas transparente à 100% pour les applications hébergées.