From abecbfe8725b32ccb2862bcbbb1fc2e73584393f Mon Sep 17 00:00:00 2001 From: mike Date: Tue, 22 Nov 2016 09:51:45 +0800 Subject: [PATCH 1/7] destroy socket when error --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index 68013ac..b95ce45 100644 --- a/index.js +++ b/index.js @@ -166,6 +166,7 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { error.code = 'ECONNRESET' options.request.emit('error', error) self.removeSocket(placeholder) + socket.destroy(); } } From b4ce7b83532db434f6fc2854eb175caf821ec6a9 Mon Sep 17 00:00:00 2001 From: mike Date: Thu, 15 Dec 2016 21:50:07 +0800 Subject: [PATCH 2/7] callback even if connect response statuscode is not 200 --- index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index b95ce45..ecabf7d 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ -'use strict' + 'use strict' var net = require('net') , tls = require('tls') @@ -164,9 +164,10 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { debug('tunneling socket could not be established, statusCode=%d', res.statusCode) var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) error.code = 'ECONNRESET' - options.request.emit('error', error) + cb(socket) + options.request.emit('error', error) // fire up error on ClientRequest. self.removeSocket(placeholder) - socket.destroy(); + //socket.destroy(); } } From 02c90a4dbd7e05115b4029d4b60b02476a7e46e1 Mon Sep 17 00:00:00 2001 From: mike Date: Wed, 21 Dec 2016 20:41:08 +0800 Subject: [PATCH 3/7] fix close_wait bug --- index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index ecabf7d..a9d0fb9 100644 --- a/index.js +++ b/index.js @@ -154,20 +154,18 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { function onConnect(res, socket, head) { connectReq.removeAllListeners() socket.removeAllListeners() + self.sockets[self.sockets.indexOf(placeholder)] = socket if (res.statusCode === 200) { assert.equal(head.length, 0) debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket cb(socket) } else { debug('tunneling socket could not be established, statusCode=%d', res.statusCode) var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) error.code = 'ECONNRESET' - cb(socket) + cb(socket) options.request.emit('error', error) // fire up error on ClientRequest. - self.removeSocket(placeholder) - //socket.destroy(); } } From de8e946d03d91ed168bfcdf1f2961d43d51c8b04 Mon Sep 17 00:00:00 2001 From: mike Date: Wed, 28 Dec 2016 23:33:29 +0800 Subject: [PATCH 4/7] fix connect timeout bug --- index.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/index.js b/index.js index a9d0fb9..8b94039 100644 --- a/index.js +++ b/index.js @@ -137,8 +137,23 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { connectReq.once('upgrade', onUpgrade) // for v0.6 connectReq.once('connect', onConnect) // for v0.7 or later connectReq.once('error', onError) + connectReq.once('socket',onSocketAssigned) connectReq.end() + function onSocketAssigned(socket){ + socket.setTimeout(options.timeout || 15000, function(){ + connectReq.removeAllListeners() + + var error = new Error('tunneling socket could not be established, ' + 'cause=http connect timeout'); + error.code = 'ESOCKETTIMEDOUT'; + debug('tunneling socket could not be established, cause=http connect timeout\n', error.stack); + + socket.destroy(); + options.request.emit('error', error); + self.removeSocket(placeholder); + }); + } + function onResponse(res) { // Very hacky. This is necessary to avoid http-parser leaks. res.upgrade = true From 0efb16eb5629f86b4e90cb5ed48c69eb333c5492 Mon Sep 17 00:00:00 2001 From: mike Date: Thu, 29 Dec 2016 11:23:35 +0800 Subject: [PATCH 5/7] fix bug, destroy socket --- index.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 8b94039..12bcf78 100644 --- a/index.js +++ b/index.js @@ -141,16 +141,11 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { connectReq.end() function onSocketAssigned(socket){ - socket.setTimeout(options.timeout || 15000, function(){ - connectReq.removeAllListeners() - - var error = new Error('tunneling socket could not be established, ' + 'cause=http connect timeout'); + var timeout = options.timeout || 1500; + socket.setTimeout(timeout, function(){ + var error = new Error('connect timeout'); error.code = 'ESOCKETTIMEDOUT'; - debug('tunneling socket could not be established, cause=http connect timeout\n', error.stack); - - socket.destroy(); - options.request.emit('error', error); - self.removeSocket(placeholder); + onError(error); }); } From 07178361cbbd1ed0ff53e82e8885422d0110771e Mon Sep 17 00:00:00 2001 From: mike Date: Thu, 29 Dec 2016 11:50:09 +0800 Subject: [PATCH 6/7] modify default timeout --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 12bcf78..bb66c55 100644 --- a/index.js +++ b/index.js @@ -141,7 +141,7 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { connectReq.end() function onSocketAssigned(socket){ - var timeout = options.timeout || 1500; + var timeout = options.timeout || 15000; socket.setTimeout(timeout, function(){ var error = new Error('connect timeout'); error.code = 'ESOCKETTIMEDOUT'; From c129c8ee509cbc856e60fa8d2f993a6556e98d49 Mon Sep 17 00:00:00 2001 From: mike Date: Fri, 30 Dec 2016 16:15:37 +0800 Subject: [PATCH 7/7] fix bug of tunnel connect timeout --- index.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index bb66c55..c250dc1 100644 --- a/index.js +++ b/index.js @@ -137,18 +137,11 @@ TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { connectReq.once('upgrade', onUpgrade) // for v0.6 connectReq.once('connect', onConnect) // for v0.7 or later connectReq.once('error', onError) - connectReq.once('socket',onSocketAssigned) + connectReq.setTimeout(options.timeout || 15000, function(){ + connectReq.abort(); + }); connectReq.end() - function onSocketAssigned(socket){ - var timeout = options.timeout || 15000; - socket.setTimeout(timeout, function(){ - var error = new Error('connect timeout'); - error.code = 'ESOCKETTIMEDOUT'; - onError(error); - }); - } - function onResponse(res) { // Very hacky. This is necessary to avoid http-parser leaks. res.upgrade = true