1'use strict'; 2const common = require('../common'); 3if (!common.hasCrypto) 4 common.skip('missing crypto'); 5 6const assert = require('assert'); 7const tls = require('tls'); 8const stream = require('stream'); 9const net = require('net'); 10const fixtures = require('../common/fixtures'); 11 12const options = { key: fixtures.readKey('rsa_private.pem'), 13 cert: fixtures.readKey('rsa_cert.crt'), 14 ca: [ fixtures.readKey('rsa_ca.crt') ], 15 ciphers: 'AES256-GCM-SHA384' }; 16const content = 'hello world'; 17const recv_bufs = []; 18let send_data = ''; 19const server = tls.createServer(options, function(s) { 20 s.on('data', function(c) { 21 recv_bufs.push(c); 22 }); 23}); 24server.listen(0, function() { 25 const raw = net.connect(this.address().port); 26 27 let pending = false; 28 raw.on('readable', function() { 29 if (pending) 30 p._read(); 31 }); 32 33 const p = new stream.Duplex({ 34 read: function read() { 35 pending = false; 36 37 const chunk = raw.read(); 38 if (chunk) { 39 this.push(chunk); 40 } else { 41 pending = true; 42 } 43 }, 44 write: function write(data, enc, cb) { 45 raw.write(data, enc, cb); 46 } 47 }); 48 49 const socket = tls.connect({ 50 socket: p, 51 rejectUnauthorized: false 52 }, function() { 53 for (let i = 0; i < 50; ++i) { 54 socket.write(content); 55 send_data += content; 56 } 57 socket.end(); 58 server.close(); 59 }); 60}); 61 62process.on('exit', function() { 63 const recv_data = (Buffer.concat(recv_bufs)).toString(); 64 assert.strictEqual(send_data, recv_data); 65}); 66