Skip to content

Commit

Permalink
dgram: make send cb act as "error" event handler
Browse files Browse the repository at this point in the history
Modifies the dgram send() method to not emit errors when a DNS
lookup fails if there is a callback. Given that the same UDP
socket can be used to send messages to different hosts, the socket
can be reused even if one of those send() fails.

This slightly changes the behavior of a stable API, so that it behaves
as users would expect to.

This is based on nodejs/node-v0.x-archive#7738, which
landed in 77266d7.

Fixes: nodejs/node-v0.x-archive#4846
Refs: nodejs/node-v0.x-archive#7738
PR-URL: #1796
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
mcollina authored and rvagg committed Jul 22, 2015
1 parent 6b3f046 commit acac161
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 62 deletions.
6 changes: 3 additions & 3 deletions doc/api/dgram.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +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. 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.
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: 1 addition & 5 deletions lib/dgram.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,12 +300,8 @@ Socket.prototype.send = function(buffer,

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

if (self.listeners('error').length)
self.emit('error', ex);

return;
}

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();
}
54 changes: 0 additions & 54 deletions test/simple/test-dgram-send-cb-quelches-error.js

This file was deleted.

0 comments on commit acac161

Please sign in to comment.