@ -881,64 +881,77 @@ Socket.prototype.connect = function(options, cb) {
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 ) {