diff --git a/.travis.yml b/.travis.yml index 805d3d50..4472d5b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,8 @@ node_js: - "6" - "7" - "8" + - "10" + - "12" install: - PATH="`npm bin`:`npm bin -g`:$PATH" diff --git a/index.js b/index.js index 0a2fdabe..64526639 100644 --- a/index.js +++ b/index.js @@ -91,7 +91,6 @@ HttpsProxyAgent.prototype.callback = function connect(req, opts, fn) { } function cleanup() { - socket.removeListener('data', ondata); socket.removeListener('end', onend); socket.removeListener('error', onerror); socket.removeListener('close', onclose); @@ -120,11 +119,7 @@ HttpsProxyAgent.prototype.callback = function connect(req, opts, fn) { if (!~str.indexOf('\r\n\r\n')) { // keep buffering debug('have not received end of HTTP headers yet...'); - if (socket.read) { - read(); - } else { - socket.once('data', ondata); - } + read(); return; } @@ -155,6 +150,7 @@ HttpsProxyAgent.prototype.callback = function connect(req, opts, fn) { } cleanup(); + req.once('socket', resume); fn(null, sock); } else { // some other status code that's not 200... need to re-play the HTTP header @@ -174,17 +170,14 @@ HttpsProxyAgent.prototype.callback = function connect(req, opts, fn) { function onsocket(socket) { // replay the "buffers" Buffer onto the `socket`, since at this point // the HTTP module machinery has been hooked up for the user - if ('function' == typeof socket.ondata) { - // node <= v0.11.3, the `ondata` function is set on the socket - socket.ondata(buffers, 0, buffers.length); - } else if (socket.listeners('data').length > 0) { - // node > v0.11.3, the "data" event is listened for directly + if (socket.listenerCount('data') > 0) { socket.emit('data', buffers); } else { // never? throw new Error('should not happen...'); } + socket.resume(); // nullify the cached Buffer instance buffers = null; } @@ -193,11 +186,7 @@ HttpsProxyAgent.prototype.callback = function connect(req, opts, fn) { socket.on('close', onclose); socket.on('end', onend); - if (socket.read) { - read(); - } else { - socket.once('data', ondata); - } + read(); var hostname = opts.host + ':' + opts.port; var msg = 'CONNECT ' + hostname + ' HTTP/1.1\r\n'; @@ -224,6 +213,17 @@ HttpsProxyAgent.prototype.callback = function connect(req, opts, fn) { socket.write(msg + '\r\n'); }; +/** + * Resumes a socket. + * + * @param {(net.Socket|tls.Socket)} socket The socket to resume + * @api public + */ + +function resume(socket) { + socket.resume(); +} + function isDefaultPort(port, secure) { return Boolean((!secure && port === 80) || (secure && port === 443)); } diff --git a/test/test.js b/test/test.js index b3684958..6ed1e88e 100644 --- a/test/test.js +++ b/test/test.js @@ -71,23 +71,23 @@ describe('HttpsProxyAgent', function () { // shut down test HTTP server after(function (done) { - server.once('close', function () { done(); }); server.close(); + done(); }); after(function (done) { - proxy.once('close', function () { done(); }); proxy.close(); + done(); }); after(function (done) { - sslServer.once('close', function () { done(); }); sslServer.close(); + done(); }); after(function (done) { - sslProxy.once('close', function () { done(); }); sslProxy.close(); + done(); }); describe('constructor', function () {