@@ -37,6 +37,8 @@ const {
37
37
ERR_INVALID_ARG_TYPE ,
38
38
} ,
39
39
} = require ( 'internal/errors' ) ;
40
+ const { once } = require ( 'internal/util' ) ;
41
+
40
42
const kOnKeylog = Symbol ( 'onkeylog' ) ;
41
43
// New Agent code.
42
44
@@ -94,52 +96,55 @@ function Agent(options) {
94
96
// case of socket.destroy() below this 'error' has no handler
95
97
// and could cause unhandled exception.
96
98
97
- if ( socket . writable &&
98
- this . requests [ name ] && this . requests [ name ] . length ) {
99
- const req = this . requests [ name ] . shift ( ) ;
99
+ if ( ! socket . writable ) {
100
+ socket . destroy ( ) ;
101
+ return ;
102
+ }
103
+
104
+ const requests = this . requests [ name ] ;
105
+ if ( requests && requests . length ) {
106
+ const req = requests . shift ( ) ;
100
107
setRequestSocket ( this , req , socket ) ;
101
- if ( this . requests [ name ] . length === 0 ) {
102
- // don't leak
108
+ if ( requests . length === 0 ) {
103
109
delete this . requests [ name ] ;
104
110
}
105
- } else {
106
- // If there are no pending requests, then put it in
107
- // the freeSockets pool, but only if we're allowed to do so.
108
- const req = socket . _httpMessage ;
109
- if ( req &&
110
- req . shouldKeepAlive &&
111
- socket . writable &&
112
- this . keepAlive ) {
113
- let freeSockets = this . freeSockets [ name ] ;
114
- const freeLen = freeSockets ? freeSockets . length : 0 ;
115
- let count = freeLen ;
116
- if ( this . sockets [ name ] )
117
- count += this . sockets [ name ] . length ;
118
-
119
- if ( count > this . maxSockets || freeLen >= this . maxFreeSockets ) {
120
- socket . destroy ( ) ;
121
- } else if ( this . keepSocketAlive ( socket ) ) {
122
- freeSockets = freeSockets || [ ] ;
123
- this . freeSockets [ name ] = freeSockets ;
124
- socket [ async_id_symbol ] = - 1 ;
125
- socket . _httpMessage = null ;
126
- this . removeSocket ( socket , options ) ;
127
-
128
- const agentTimeout = this . options . timeout || 0 ;
129
- if ( socket . timeout !== agentTimeout ) {
130
- socket . setTimeout ( agentTimeout ) ;
131
- }
132
-
133
- socket . once ( 'error' , freeSocketErrorListener ) ;
134
- freeSockets . push ( socket ) ;
135
- } else {
136
- // Implementation doesn't want to keep socket alive
137
- socket . destroy ( ) ;
138
- }
139
- } else {
140
- socket . destroy ( ) ;
141
- }
111
+ return ;
112
+ }
113
+
114
+ // If there are no pending requests, then put it in
115
+ // the freeSockets pool, but only if we're allowed to do so.
116
+ const req = socket . _httpMessage ;
117
+ if ( ! req || ! req . shouldKeepAlive || ! this . keepAlive ) {
118
+ socket . destroy ( ) ;
119
+ return ;
142
120
}
121
+
122
+ let freeSockets = this . freeSockets [ name ] ;
123
+ const freeLen = freeSockets ? freeSockets . length : 0 ;
124
+ let count = freeLen ;
125
+ if ( this . sockets [ name ] )
126
+ count += this . sockets [ name ] . length ;
127
+
128
+ if ( count > this . maxSockets ||
129
+ freeLen >= this . maxFreeSockets ||
130
+ ! this . keepSocketAlive ( socket ) ) {
131
+ socket . destroy ( ) ;
132
+ return ;
133
+ }
134
+
135
+ freeSockets = freeSockets || [ ] ;
136
+ this . freeSockets [ name ] = freeSockets ;
137
+ socket [ async_id_symbol ] = - 1 ;
138
+ socket . _httpMessage = null ;
139
+ this . removeSocket ( socket , options ) ;
140
+
141
+ const agentTimeout = this . options . timeout || 0 ;
142
+ if ( socket . timeout !== agentTimeout ) {
143
+ socket . setTimeout ( agentTimeout ) ;
144
+ }
145
+
146
+ socket . once ( 'error' , freeSocketErrorListener ) ;
147
+ freeSockets . push ( socket ) ;
143
148
} ) ;
144
149
145
150
// Don't emit keylog events unless there is a listener for them.
@@ -266,12 +271,8 @@ Agent.prototype.createSocket = function createSocket(req, options, cb) {
266
271
267
272
debug ( 'createConnection' , name , options ) ;
268
273
options . encoding = null ;
269
- let called = false ;
270
274
271
- const oncreate = ( err , s ) => {
272
- if ( called )
273
- return ;
274
- called = true ;
275
+ const oncreate = once ( ( err , s ) => {
275
276
if ( err )
276
277
return cb ( err ) ;
277
278
if ( ! this . sockets [ name ] ) {
@@ -281,7 +282,7 @@ Agent.prototype.createSocket = function createSocket(req, options, cb) {
281
282
debug ( 'sockets' , name , this . sockets [ name ] . length ) ;
282
283
installListeners ( this , s , options ) ;
283
284
cb ( null , s ) ;
284
- } ;
285
+ } ) ;
285
286
286
287
const newSocket = this . createConnection ( options , oncreate ) ;
287
288
if ( newSocket )
0 commit comments