mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
1b2e2944bc
When dgram socket implicit binding fails, an attempt is made to clean up the send queue. This was originally implemented using an 'error' handler that performed cleanup and then emitted a fake error, which concealed the original error. This was done to prevent cases where the same error was emitted twice. Now that the errorMonitor event is available, use that to perform the cleanup without impacting the actual error handling. PR-URL: https://github.com/nodejs/node/pull/31958 Refs: https://github.com/nodejs/help/issues/2484 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
41 lines
1.3 KiB
JavaScript
41 lines
1.3 KiB
JavaScript
// Flags: --expose-internals
|
|
'use strict';
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const EventEmitter = require('events');
|
|
const dgram = require('dgram');
|
|
const dns = require('dns');
|
|
const { kStateSymbol } = require('internal/dgram');
|
|
const mockError = new Error('fake DNS');
|
|
|
|
// Monkey patch dns.lookup() so that it always fails.
|
|
dns.lookup = function(address, family, callback) {
|
|
process.nextTick(() => { callback(mockError); });
|
|
};
|
|
|
|
const socket = dgram.createSocket('udp4');
|
|
|
|
socket.on(EventEmitter.errorMonitor, common.mustCall((err) => {
|
|
// The DNS lookup should fail since it is monkey patched. At that point in
|
|
// time, the send queue should be populated with the send() operation.
|
|
assert.strictEqual(err, mockError);
|
|
assert(Array.isArray(socket[kStateSymbol].queue));
|
|
assert.strictEqual(socket[kStateSymbol].queue.length, 1);
|
|
}, 3));
|
|
|
|
socket.on('error', common.mustCall((err) => {
|
|
assert.strictEqual(err, mockError);
|
|
assert.strictEqual(socket[kStateSymbol].queue, undefined);
|
|
}, 3));
|
|
|
|
// Initiate a few send() operations, which will fail.
|
|
socket.send('foobar', common.PORT, 'localhost');
|
|
|
|
process.nextTick(() => {
|
|
socket.send('foobar', common.PORT, 'localhost');
|
|
});
|
|
|
|
setImmediate(() => {
|
|
socket.send('foobar', common.PORT, 'localhost');
|
|
});
|