diff --git a/lib/connection.js b/lib/connection.js index d2cf69ec..208f0574 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -82,8 +82,13 @@ Connection.prototype.connect = function (port, host) { this.stream.once('data', function (buffer) { var responseCode = buffer.toString('utf8') - if (responseCode !== 'S') { - return self.emit('error', new Error('The server does not support SSL connections')) + switch (responseCode) { + case 'N': + return self.emit('error', new Error('The server does not support SSL connections')) + case 'S': + break + default: + return self.emit('error', new Error('There was an error establishing an SSL connection')) } var tls = require('tls') self.stream = tls.connect({ diff --git a/test/unit/connection/error-tests.js b/test/unit/connection/error-tests.js index 329e1e31..f39187cf 100644 --- a/test/unit/connection/error-tests.js +++ b/test/unit/connection/error-tests.js @@ -37,26 +37,52 @@ suite.test('connection does not emit ECONNRESET errors during disconnect', funct done() }) +var SSLNegotiationPacketTests = [ + { + testName: 'connection does not emit ECONNRESET errors during disconnect also when using SSL', + errorMessage: null, + response: 'S', + responseType: 'sslconnect' + }, + { + testName: 'connection emits an error when SSL is not supported', + errorMessage: 'The server does not support SSL connections', + response: 'N', + responseType: 'error' + }, + { + testName: 'connection emits an error when postmaster responds to SSL negotiation packet', + errorMessage: 'There was an error establishing an SSL connection', + response: 'E', + responseType: 'error' + } +] -suite.test('connection does not emit ECONNRESET errors during disconnect also when using SSL', function (done) { - // our fake postgres server, which just responds with 'S' to start SSL - var socket - var server = net.createServer(function (c) { - socket = c - c.once('data', function (data) { - c.write(Buffer.from('S')) +for (var i = 0; i < SSLNegotiationPacketTests.length; i++) { + var tc = SSLNegotiationPacketTests[i] + suite.test(tc.testName, function (done) { + // our fake postgres server + var socket + var server = net.createServer(function (c) { + socket = c + c.once('data', function (data) { + c.write(Buffer.from(tc.response)) + }) + }) + + server.listen(7778, function () { + var con = new Connection({ssl: true}) + con.connect(7778, 'localhost') + assert.emits(con, tc.responseType, function (err) { + if (err) { + assert.equal(err.message, tc.errorMessage) + } + con.end() + socket.destroy() + server.close() + done() + }) + con.requestSsl() }) }) - - server.listen(7778, function () { - var con = new Connection({ssl: true}) - con.connect(7778, 'localhost') - assert.emits(con, 'sslconnect', function () { - con.end() - socket.destroy() - server.close() - done() - }) - con.requestSsl() - }) -}) +}