diff --git a/.gitignore b/.gitignore index d1ae715..0e8f9c1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ node_modules cov atest.js notes +prismus-proxy.js diff --git a/lib/caronte/common.js b/lib/caronte/common.js index 52b7767..2a2954b 100644 --- a/lib/caronte/common.js +++ b/lib/caronte/common.js @@ -33,3 +33,12 @@ common.setupOutgoing = function(outgoing, options, req, forward) { return outgoing; }; + +common.setupSocket = function(socket) { + socket.setTimeout(0); + socket.setNoDelay(true); + + socket.setKeepAlive(true, 0); + + return socket; +}; diff --git a/lib/caronte/passes/ws.js b/lib/caronte/passes/ws.js index 821cb2e..1c9215b 100644 --- a/lib/caronte/passes/ws.js +++ b/lib/caronte/passes/ws.js @@ -72,11 +72,15 @@ function XHeaders(req, socket, options) { * */ function stream(req, socket, options, head) { + common.setupSocket(socket); + var proxyReq = http.request( common.setupOutgoing(options.ssl || {}, options, req) ); proxyReq.on('upgrade', function(proxyRes, proxySocket, proxyHead) { + common.setupSocket(proxySocket); + if (proxyHead && proxyHead.length) proxySocket.unshift(proxyHead); socket.write('HTTP/1.1 101 Switching Protocols\r\n'); diff --git a/primus-proxy.js b/primus-proxy.js new file mode 100644 index 0000000..9a23276 --- /dev/null +++ b/primus-proxy.js @@ -0,0 +1,50 @@ +var http = require('http'); +var caronte = require('./'); +var Primus = require('primus'); + +var server = http.createServer(function (req, res) { + res.writeHead(500); + res.end('Not Implemented\n'); +}); + +var primus = new Primus(server, { transformer: 'engine.io' }); +var Socket = primus.Socket; + +primus.on('error', function (err) { + console.log('Primus ' + err); +}); + +primus.on('connection', function (spark) { + spark.write({ from: 'server', to: 'client' }); + + spark.on('data', function (data) { + console.dir(data); + }); +}); + +primus.on('disconnection', function (spark) { + console.log('disconnected'); +}); + +server.listen(9000); + +var proxy = caronte.createProxyServer({ + ws: true, + target: 'http://localhost:9000' +}); + +var srv = proxy.listen(3000); + +var socket = new Socket('http://localhost:3000'); + +socket.on('reconnecting', function () { + console.log('reconnecting'); +}); + +socket.on('open', function () { + socket.write({ from: 'client', to: 'server' }) +}); + +socket.on('data', function (data) { + console.dir(data); +});