From b3d1e504f4a3a4c44be3ca53b2aa44282fc391df Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 7 May 2013 11:55:12 -0700 Subject: [PATCH] net: emit dns 'lookup' event before connect net.connect() and net.createConnection() now emit a 'lookup' event after resolving the hostname but before connecting. Fixes #5418. --- doc/api/net.markdown | 9 +++++++ lib/net.js | 2 ++ test/simple/test-net-dns-error.js | 6 +++++ test/simple/test-net-dns-lookup.js | 43 ++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 test/simple/test-net-dns-lookup.js diff --git a/doc/api/net.markdown b/doc/api/net.markdown index 160e2375ef0..34de227478f 100644 --- a/doc/api/net.markdown +++ b/doc/api/net.markdown @@ -450,6 +450,15 @@ The amount of bytes sent. `net.Socket` instances are [EventEmitter][] with the following events: +### Event: 'lookup' + +Emitted after resolving the hostname but before connecting. +Not applicable to UNIX sockets. + +* `err` {Error | Null} The error object. See [dns.lookup()][]. +* `address` {String} The IP address. +* `family` {String | Null} The address type. See [dns.lookup()][]. + ### Event: 'connect' Emitted when a socket connection is successfully established. diff --git a/lib/net.js b/lib/net.js index 4affa8d7546..a86ca85d12f 100644 --- a/lib/net.js +++ b/lib/net.js @@ -860,6 +860,8 @@ Socket.prototype.connect = function(options, cb) { var host = options.host; debug('connect: find host ' + host); require('dns').lookup(host, function(err, ip, addressType) { + self.emit('lookup', err, ip, addressType); + // It's possible we were destroyed while looking this up. // XXX it would be great if we could cancel the promise returned by // the look up. diff --git a/test/simple/test-net-dns-error.js b/test/simple/test-net-dns-error.js index 10857a9af03..f7221389a24 100644 --- a/test/simple/test-net-dns-error.js +++ b/test/simple/test-net-dns-error.js @@ -43,6 +43,12 @@ socket.on('error', function(err) { assert.equal(err.code, 'ENOTFOUND'); actual_bad_connections++; }); +socket.on('lookup', function(err, ip, type) { + assert(err instanceof Error); + assert.equal(err.code, 'ENOTFOUND'); + assert.equal(ip, undefined); + assert.equal(type, undefined); +}); process.on('exit', function() { assert.equal(actual_bad_connections, expected_bad_connections); diff --git a/test/simple/test-net-dns-lookup.js b/test/simple/test-net-dns-lookup.js new file mode 100644 index 00000000000..5628e4d8a3b --- /dev/null +++ b/test/simple/test-net-dns-lookup.js @@ -0,0 +1,43 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var common = require('../common'); +var assert = require('assert'); +var net = require('net'); +var ok = false; + +var server = net.createServer(function(client) { + client.end(); + server.close(); +}); + +server.listen(common.PORT, '127.0.0.1', function() { + net.connect(common.PORT, '127.0.0.1').on('lookup', function(err, ip, type) { + assert.equal(err, null); + assert.equal(ip, '127.0.0.1'); + assert.equal(type, '4'); + ok = true; + }); +}); + +process.on('exit', function() { + assert(ok); +});