Merge pull request #574 from TPXP/fix-bind-crash
Handle connection refused and connection timeouts gracefully
This commit is contained in:
commit
f690493768
|
@ -282,7 +282,15 @@ Client.prototype.bind = function bind (name,
|
||||||
controls: controls
|
controls: controls
|
||||||
})
|
})
|
||||||
|
|
||||||
return this._send(req, [errors.LDAP_SUCCESS], null, callback, _bypass)
|
// Connection errors will be reported to the bind callback too (useful when the LDAP server is not available)
|
||||||
|
var self = this
|
||||||
|
function callbackWrapper (err, ret) {
|
||||||
|
self.removeListener('connectError', callbackWrapper)
|
||||||
|
callback(err, ret)
|
||||||
|
}
|
||||||
|
this.addListener('connectError', callbackWrapper)
|
||||||
|
|
||||||
|
return this._send(req, [errors.LDAP_SUCCESS], null, callbackWrapper, _bypass)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1004,6 +1012,8 @@ Client.prototype.connect = function connect () {
|
||||||
// Communicate the last-encountered error
|
// Communicate the last-encountered error
|
||||||
if (err instanceof ConnectionError) {
|
if (err instanceof ConnectionError) {
|
||||||
self.emit('connectTimeout', err)
|
self.emit('connectTimeout', err)
|
||||||
|
} else if (err.code === 'ECONNREFUSED') {
|
||||||
|
self.emit('connectRefused', err)
|
||||||
} else {
|
} else {
|
||||||
self.emit('error', err)
|
self.emit('error', err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1474,3 +1474,42 @@ tap.test('resultError handling', function (t) {
|
||||||
t.fail('should not get error')
|
t.fail('should not get error')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
tap.test('connection refused', function (t) {
|
||||||
|
const client = ldap.createClient({
|
||||||
|
url: 'ldap://0.0.0.0'
|
||||||
|
})
|
||||||
|
|
||||||
|
client.bind('cn=root', 'secret', function (err, res) {
|
||||||
|
t.true(err)
|
||||||
|
t.type(err, Error)
|
||||||
|
t.equals(err.code, 'ECONNREFUSED')
|
||||||
|
t.false(res)
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
tap.test('connection timeout', function (t) {
|
||||||
|
const client = ldap.createClient({
|
||||||
|
url: 'ldap://example.org',
|
||||||
|
connectTimeout: 1,
|
||||||
|
timeout: 1
|
||||||
|
})
|
||||||
|
|
||||||
|
var done = false
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
if (!done) {
|
||||||
|
throw new Error('LDAPJS waited for the server for too long')
|
||||||
|
}
|
||||||
|
}, 2000)
|
||||||
|
|
||||||
|
client.bind('cn=root', 'secret', function (err, res) {
|
||||||
|
t.true(err)
|
||||||
|
t.type(err, Error)
|
||||||
|
t.equals(err.message, 'connection timeout')
|
||||||
|
done = true
|
||||||
|
t.false(res)
|
||||||
|
t.end()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in New Issue