@@ -135,7 +135,6 @@ let autoSelectFamilyDefault = getOptionValue('--enable-network-family-autoselect
135135
136136const { clearTimeout, setTimeout } = require ( 'timers' ) ;
137137const { kTimeout } = require ( 'internal/timers' ) ;
138- const kTimeoutTriggered = Symbol ( 'kTimeoutTriggered' ) ;
139138
140139const DEFAULT_IPV4_ADDR = '0.0.0.0' ;
141140const DEFAULT_IPV6_ADDR = '::' ;
@@ -1093,9 +1092,11 @@ function internalConnectMultiple(context) {
10931092 return ;
10941093 }
10951094
1095+
1096+ const current = context . current ++ ;
1097+ const handle = current === 0 ? self . _handle : new TCP ( TCPConstants . SOCKET ) ;
10961098 const { localPort, port, flags } = context ;
1097- const { address, family : addressType } = context . addresses [ context . current ++ ] ;
1098- const handle = new TCP ( TCPConstants . SOCKET ) ;
1099+ const { address, family : addressType } = context . addresses [ current ] ;
10991100 let localAddress ;
11001101 let err ;
11011102
@@ -1120,7 +1121,7 @@ function internalConnectMultiple(context) {
11201121 }
11211122
11221123 const req = new TCPConnectWrap ( ) ;
1123- req . oncomplete = FunctionPrototypeBind ( afterConnectMultiple , undefined , context ) ;
1124+ req . oncomplete = FunctionPrototypeBind ( afterConnectMultiple , undefined , context , current ) ;
11241125 req . address = address ;
11251126 req . port = port ;
11261127 req . localAddress = localAddress ;
@@ -1147,8 +1148,12 @@ function internalConnectMultiple(context) {
11471148 return ;
11481149 }
11491150
1150- // If the attempt has not returned an error, start the connection timer
1151- context [ kTimeout ] = setTimeout ( internalConnectMultipleTimeout , context . timeout , context , req ) ;
1151+ if ( current < context . addresses . length - 1 ) {
1152+ debug ( 'connect/multiple: setting the attempt timeout to %d ms' , context . timeout ) ;
1153+
1154+ // If the attempt has not returned an error, start the connection timer
1155+ context [ kTimeout ] = setTimeout ( internalConnectMultipleTimeout , context . timeout , context , req , handle ) ;
1156+ }
11521157}
11531158
11541159Socket . prototype . connect = function ( ...args ) {
@@ -1419,7 +1424,6 @@ function lookupAndConnectMultiple(self, async_id_symbol, lookup, host, options,
14191424 localPort,
14201425 timeout,
14211426 [ kTimeout ] : null ,
1422- [ kTimeoutTriggered ] : false ,
14231427 errors : [ ] ,
14241428 } ;
14251429
@@ -1522,12 +1526,20 @@ function afterConnect(status, handle, req, readable, writable) {
15221526 }
15231527}
15241528
1525- function afterConnectMultiple ( context , status , handle , req , readable , writable ) {
1526- const self = context . socket ;
1527-
1529+ function afterConnectMultiple ( context , current , status , handle , req , readable , writable ) {
15281530 // Make sure another connection is not spawned
15291531 clearTimeout ( context [ kTimeout ] ) ;
15301532
1533+ // One of the connection has completed and correctly dispatched but after timeout, ignore this one
1534+ if ( status === 0 && current !== context . current - 1 ) {
1535+ debug ( 'connect/multiple: ignoring successful but timedout connection to %s:%s' , req . address , req . port ) ;
1536+ handle . close ( ) ;
1537+ return ;
1538+ }
1539+
1540+ const self = context . socket ;
1541+
1542+
15311543 // Some error occurred, add to the list of exceptions
15321544 if ( status !== 0 ) {
15331545 let details ;
@@ -1552,7 +1564,7 @@ function afterConnectMultiple(context, status, handle, req, readable, writable)
15521564 }
15531565
15541566 // One of the connection has completed and correctly dispatched but after timeout, ignore this one
1555- if ( context [ kTimeoutTriggered ] ) {
1567+ if ( status === 0 && current !== context . current - 1 ) {
15561568 debug ( 'connect/multiple: ignoring successful but timedout connection to %s:%s' , req . address , req . port ) ;
15571569 handle . close ( ) ;
15581570 return ;
@@ -1578,8 +1590,10 @@ function afterConnectMultiple(context, status, handle, req, readable, writable)
15781590 afterConnect ( status , handle , req , readable , writable ) ;
15791591}
15801592
1581- function internalConnectMultipleTimeout ( context , req ) {
1582- context [ kTimeoutTriggered ] = true ;
1593+ function internalConnectMultipleTimeout ( context , req , handle ) {
1594+ debug ( 'connect/multiple: connection to %s:%s timed out' , req . address , req . port ) ;
1595+ req . oncomplete = undefined ;
1596+ handle . close ( ) ;
15831597 internalConnectMultiple ( context ) ;
15841598}
15851599
0 commit comments