Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dgram: do not emit error for failed DNS lookups in send() #1796

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion doc/api/dgram.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,9 @@ assigned a random port number and is bound to the "all interfaces" address
An optional callback may be specified to detect DNS errors or for determining
when it's safe to reuse the `buf` object. Note that DNS lookups delay the time
to send for at least one tick. The only way to know for sure that the datagram
has been sent is by using a callback.
has been sent is by using a callback. If an error occurs and a callback is given,
the error will be the first argument to the callback. If a callback is not given,
the error is emitted as an `'error'` event on the `socket` object.

With consideration for multi-byte characters, `offset` and `length` will
be calculated with respect to
Expand Down
6 changes: 5 additions & 1 deletion lib/dgram.js
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,11 @@ Socket.prototype.send = function(buffer,

self._handle.lookup(address, function(ex, ip) {
if (ex) {
if (callback) callback(ex);
if (typeof callback === 'function') {
callback(ex);
return;
}

self.emit('error', ex);
} else if (self._handle) {
var req = new SendWrap();
Expand Down
37 changes: 37 additions & 0 deletions test/internet/test-dgram-send-cb-quelches-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
'use strict';
var common = require('../common');
var mustCall = common.mustCall;
var assert = require('assert');
var dgram = require('dgram');
var dns = require('dns');

var socket = dgram.createSocket('udp4');
var buffer = new Buffer('gary busey');

dns.setServers([]);

socket.once('error', onEvent);

// assert that:
// * callbacks act as "error" listeners if given.
// * error is never emitter for missing dns entries
// if a callback that handles error is present
// * error is emitted if a callback with no argument is passed
socket.send(buffer, 0, buffer.length, 100,
'dne.example.com', mustCall(callbackOnly));

function callbackOnly(err) {
assert.ok(err);
socket.removeListener('error', onEvent);
socket.on('error', mustCall(onError));
socket.send(buffer, 0, buffer.length, 100, 'dne.example.com');
}

function onEvent(err) {
assert.fail('Error should not be emitted if there is callback');
}

function onError(err) {
assert.ok(err);
socket.close();
}