connect(self, options.path);
} else {
- const dns = require('dns');
- var host = options.host || 'localhost';
- var port = 0;
- var localAddress = options.localAddress;
- var localPort = options.localPort;
- var dnsopts = {
- family: options.family,
- hints: 0
- };
-
- if (localAddress && !exports.isIP(localAddress))
- throw new TypeError('localAddress must be a valid IP: ' + localAddress);
-
- if (localPort && typeof localPort !== 'number')
- throw new TypeError('localPort should be a number: ' + localPort);
-
- port = options.port;
- if (typeof port !== 'undefined') {
- if (typeof port !== 'number' && typeof port !== 'string')
- throw new TypeError('port should be a number or string: ' + port);
- if (!isLegalPort(port))
- throw new RangeError('port should be >= 0 and < 65536: ' + port);
- }
- port |= 0;
+ lookupAndConnect(self, options);
+ }
+ return self;
+};
- if (dnsopts.family !== 4 && dnsopts.family !== 6)
- dnsopts.hints = dns.ADDRCONFIG | dns.V4MAPPED;
- debug('connect: find host ' + host);
- debug('connect: dns options ' + dnsopts);
- self._host = host;
- dns.lookup(host, dnsopts, function(err, ip, addressType) {
- self.emit('lookup', err, ip, addressType);
+function lookupAndConnect(self, options) {
+ const dns = require('dns');
+ var host = options.host || 'localhost';
+ var port = options.port;
+ var localAddress = options.localAddress;
+ var localPort = options.localPort;
- // 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.
- if (!self._connecting) return;
+ if (localAddress && !exports.isIP(localAddress))
+ throw new TypeError('localAddress must be a valid IP: ' + localAddress);
- if (err) {
- // net.createConnection() creates a net.Socket object and
- // immediately calls net.Socket.connect() on it (that's us).
- // There are no event listeners registered yet so defer the
- // error event to the next tick.
- process.nextTick(connectErrorNT, self, err, options);
- } else {
- self._unrefTimer();
- connect(self,
- ip,
- port,
- addressType,
- localAddress,
- localPort);
- }
- });
+ if (localPort && typeof localPort !== 'number')
+ throw new TypeError('localPort should be a number: ' + localPort);
+
+ if (typeof port !== 'undefined') {
+ if (typeof port !== 'number' && typeof port !== 'string')
+ throw new TypeError('port should be a number or string: ' + port);
+ if (!isLegalPort(port))
+ throw new RangeError('port should be >= 0 and < 65536: ' + port);
}
- return self;
-};
+ port |= 0;
+
+ // If host is an IP, skip performing a lookup
+ // TODO(evanlucas) should we hot path this for localhost?
+ var addressType = exports.isIP(host);
+ if (addressType) {
+ connect(self, host, port, addressType, localAddress, localPort);
+ return;
+ }
+
+ var dnsopts = {
+ family: options.family,
+ hints: 0
+ };
+
+ if (dnsopts.family !== 4 && dnsopts.family !== 6)
+ dnsopts.hints = dns.ADDRCONFIG | dns.V4MAPPED;
+
+ debug('connect: find host ' + host);
+ debug('connect: dns options ' + dnsopts);
+ self._host = host;
+ dns.lookup(host, dnsopts, 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.
+ if (!self._connecting) return;
+
+ if (err) {
+ // net.createConnection() creates a net.Socket object and
+ // immediately calls net.Socket.connect() on it (that's us).
+ // There are no event listeners registered yet so defer the
+ // error event to the next tick.
+ process.nextTick(connectErrorNT, self, err, options);
+ } else {
+ self._unrefTimer();
+ connect(self,
+ ip,
+ port,
+ addressType,
+ localAddress,
+ localPort);
+ }
+ });
+}
function connectErrorNT(self, err, options) {