Files
node/test/parallel/test-tls-socket-underlying-socket.js

58 lines
1.9 KiB
JavaScript

'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const assert = require('assert');
const fixtures = require('../common/fixtures');
const net = require('net');
const tls = require('tls');
const { duplexPair } = require('stream');
const key = fixtures.readKey('agent1-key.pem');
const cert = fixtures.readKey('agent1-cert.pem');
// Server sockets over a plain connection expose that net.Socket.
{
const server = tls.createServer({ key, cert });
let rawSocket;
server.prependListener('connection', common.mustCall((socket) => {
rawSocket = socket;
}));
server.on('secureConnection', common.mustCall((tlsSocket) => {
assert.ok(rawSocket instanceof net.Socket);
assert.strictEqual(tlsSocket.socket, rawSocket);
tlsSocket.end();
server.close();
}));
server.listen(0, common.mustCall(() => {
const client = tls.connect({
port: server.address().port,
rejectUnauthorized: false,
}, common.mustCall(() => {
assert.strictEqual(client.socket, null);
client.end();
}));
}));
}
// Server sockets over any other stream expose that stream, and still do after
// a failed handshake has destroyed them.
{
const server = tls.createServer({ key, cert, minVersion: 'TLSv1.3' });
const [serverSide, clientSide] = duplexPair();
server.on('secureConnection', common.mustNotCall());
server.on('tlsClientError', common.mustCall((err, tlsSocket) => {
assert.strictEqual(tlsSocket.socket, serverSide);
setImmediate(common.mustCall(() => {
assert.strictEqual(tlsSocket.destroyed, true);
assert.strictEqual(tlsSocket.socket, serverSide);
}));
}));
server.emit('connection', serverSide);
const client = tls.connect({ socket: clientSide, maxVersion: 'TLSv1.2' });
assert.strictEqual(client.socket, clientSide);
client.on('error', common.mustCall());
}