• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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