Skip to content

Commit 70a49a4

Browse files
authoredDec 28, 2021
Close connection to server on connect errors (#647)
1 parent 243aef8 commit 70a49a4

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed
 

‎lib/connect.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,12 @@ function connect(url, socketOptions, openCallback) {
152152
if (timeout) sock.setTimeout(0);
153153
if (err === null) {
154154
openCallback(null, c);
155+
} else {
156+
// The connection isn't closed by the server on e.g. wrong password
157+
sock.end();
158+
sock.destroy();
159+
openCallback(err);
155160
}
156-
else openCallback(err);
157161
});
158162
}
159163

‎test/connect.js

+47-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
var connect = require('../lib/connect').connect;
44
var credentialsFromUrl = require('../lib/connect').credentialsFromUrl;
5+
var defs = require('../lib/defs');
56
var assert = require('assert');
67
var util = require('./util');
78
var net = require('net');
8-
var fail = util.fail, succeed = util.succeed,
9+
var fail = util.fail, succeed = util.succeed, latch = util.latch,
910
kCallback = util.kCallback,
1011
succeedIfAttributeEquals = util.succeedIfAttributeEquals;
1112
var format = require('util').format;
@@ -147,5 +148,50 @@ suite("Connect API", function() {
147148
else done();
148149
});
149150
});
151+
});
150152

153+
suite('Errors on connect', function() {
154+
var server
155+
afterEach(function() {
156+
if (server) {
157+
server.close();
158+
}
159+
})
160+
161+
test("closes underlying connection on authentication error", function(done) {
162+
var bothDone = latch(2, done);
163+
server = net.createServer(function(socket) {
164+
socket.once('data', function(protocolHeader) {
165+
assert.deepStrictEqual(
166+
protocolHeader,
167+
Buffer.from("AMQP" + String.fromCharCode(0,0,9,1))
168+
);
169+
util.runServer(socket, function(send, wait) {
170+
send(defs.ConnectionStart,
171+
{versionMajor: 0,
172+
versionMinor: 9,
173+
serverProperties: {},
174+
mechanisms: Buffer.from('PLAIN'),
175+
locales: Buffer.from('en_US')});
176+
wait(defs.ConnectionStartOk)().then(function() {
177+
send(defs.ConnectionClose,
178+
{replyCode: 403,
179+
replyText: 'ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN',
180+
classId: 0,
181+
methodId: 0});
182+
});
183+
});
184+
});
185+
186+
// Wait for the connection to be closed after the authentication error
187+
socket.once('end', function() {
188+
bothDone();
189+
});
190+
}).listen(0);
191+
192+
connect('amqp://localhost:' + server.address().port, {}, function(err) {
193+
if (!err) bothDone(new Error('Expected authentication error'));
194+
bothDone();
195+
});
196+
});
151197
});

0 commit comments

Comments
 (0)
Please sign in to comment.