89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var net = require('net'); | ||
|  | var tls = require('tls'); | ||
|  | var http = require('http'); | ||
|  | var tlsOpts = require('localhost.daplie.com-certificates').merge({}); | ||
|  | var Duplex = require('stream').Duplex; | ||
|  | var httpServer = http.createServer(function (req, res) { | ||
|  |   res.end('Hello, World!'); | ||
|  | }); | ||
|  | var tcp3000 = net.createServer(); | ||
|  | 
 | ||
|  | tcp3000.listen(3000, function () { | ||
|  |   console.log('listening on 3000'); | ||
|  | }); | ||
|  | 
 | ||
|  | 
 | ||
|  | var tls3000 = tls.createServer(tlsOpts, function (tlsSocket) { | ||
|  |   httpServer.emit('connection', tlsSocket); | ||
|  |   /* | ||
|  |   tlsSocket.on('data', function (chunk) { | ||
|  |     console.log('chunk', chunk.byteLength); | ||
|  |   }); | ||
|  |   */ | ||
|  | }); | ||
|  | 
 | ||
|  | 
 | ||
|  | tcp3000.on('connection', function (socket) { | ||
|  |   // this works when I put it here, but I don't know if it's tls yet here
 | ||
|  |   // httpsServer.emit('connection', socket);
 | ||
|  |   //tls3000.emit('connection', socket);
 | ||
|  | 
 | ||
|  |   //var tlsSocket = new tls.TLSSocket(socket, { secureContext: tls.createSecureContext(tlsOpts) });
 | ||
|  |   //tlsSocket.on('data', function (chunk) {
 | ||
|  |   //  console.log('dummy', chunk.byteLength);
 | ||
|  |   //});
 | ||
|  | 
 | ||
|  |   //return;
 | ||
|  |   socket.once('data', function (chunk) { | ||
|  |     if (/http\/1/i.test(chunk.toString())) { | ||
|  | 
 | ||
|  |       console.log("looks like http, continue"); | ||
|  | 
 | ||
|  |       // this works as expected
 | ||
|  |       httpServer.emit('connection', socket); | ||
|  | 
 | ||
|  |     } else { | ||
|  | 
 | ||
|  |       console.log("doesn't look like http, try tls"); | ||
|  | 
 | ||
|  |       // none of these methods work:
 | ||
|  |       // httpsServer.emit('connection', socket);  // this didn't work
 | ||
|  |       // tlsServer.emit('connection', socket);    // this didn't work either
 | ||
|  |       var myDuplex = new Duplex(); | ||
|  |       myDuplex._write = function (chunk, encoding, cb) { | ||
|  |         console.log('_write', chunk.byteLength); | ||
|  |         socket.write(chunk, encoding); | ||
|  |         cb(); | ||
|  |       }; | ||
|  |       myDuplex._read = function (size) { | ||
|  |         console.log('_read'); | ||
|  |         var x = socket.read(size); | ||
|  |         if (x) { | ||
|  |           console.log('_read', size); | ||
|  |           this.push(x); | ||
|  |         } | ||
|  |       }; | ||
|  |       socket.on('data', function (chunk) { | ||
|  |         console.log('socket data', chunk.byteLength); | ||
|  |         myDuplex.push(chunk); | ||
|  |       }); | ||
|  | 
 | ||
|  |       tls3000.emit('connection', myDuplex); | ||
|  |       //var tlsSocket = new tls.TLSSocket(myDuplex, { secureContext: tls.createSecureContext(tlsOpts) });
 | ||
|  |       /* | ||
|  |       var tlsSocket = new tls.TLSSocket(socket, { secureContext: tls.createSecureContext(tlsOpts) }); | ||
|  |       tlsSocket.on('data', function (chunk) { | ||
|  |         console.log('tls chunk', chunk.byteLength); | ||
|  |       }); | ||
|  |       */ | ||
|  | 
 | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     socket.unshift(chunk); | ||
|  |   }); | ||
|  | 
 | ||
|  | }); |