diff --git a/lib/net.js b/lib/net.js index 3244a09109..861d289663 100644 --- a/lib/net.js +++ b/lib/net.js @@ -236,11 +236,7 @@ Object.defineProperty(Socket.prototype, 'bufferSize', { Socket.prototype.pause = function() { this._paused = true; - if (this._connecting) { - // will actually pause once the handle is established. - return; - } - if (this._handle) { + if (this._handle && !this._connecting) { this._handle.readStop(); } }; @@ -248,11 +244,7 @@ Socket.prototype.pause = function() { Socket.prototype.resume = function() { this._paused = false; - if (this._connecting) { - // will actually resume once the handle is established. - return; - } - if (this._handle) { + if (this._handle && !this._connecting) { this._handle.readStart(); } }; @@ -737,18 +729,12 @@ function afterConnect(status, handle, req, readable, writable) { assert.ok(self._connecting); self._connecting = false; - // now that we're connected, process any pending pause state. - if (self._paused) { - self._paused = false; - self.pause(); - } - if (status == 0) { self.readable = readable; self.writable = writable; timers.active(self); - if (self.readable) { + if (self.readable && !self._paused) { handle.readStart(); } @@ -1041,7 +1027,7 @@ function onconnection(clientHandle) { }); socket.readable = socket.writable = true; - socket.resume(); + clientHandle.readStart(); self._connections++; socket.server = self; diff --git a/test/simple/test-net-pause-resume-connecting.js b/test/simple/test-net-pause-resume-connecting.js new file mode 100644 index 0000000000..264dc96801 --- /dev/null +++ b/test/simple/test-net-pause-resume-connecting.js @@ -0,0 +1,101 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var common = require('../common'), + assert = require('assert'), + net = require('net'); + +var connections = 0, + dataEvents = 0, + conn; + + +// Server +var server = net.createServer(function(conn) { + connections++; + conn.end('This was the year he fell to pieces.'); + + if (connections === 5) + server.close(); +}); + +server.listen(common.PORT); + + +// Client 1 +conn = require('net').createConnection(common.PORT, 'localhost'); +conn.resume(); +conn.on('data', onDataOk); + + +// Client 2 +conn = require('net').createConnection(common.PORT, 'localhost'); +conn.pause(); +conn.resume(); +conn.on('data', onDataOk); + + +// Client 3 +conn = require('net').createConnection(common.PORT, 'localhost'); +conn.pause(); +conn.on('data', onDataError); +scheduleTearDown(conn); + + +// Client 4 +conn = require('net').createConnection(common.PORT, 'localhost'); +conn.resume(); +conn.pause(); +conn.resume(); +conn.on('data', onDataOk); + + +// Client 5 +conn = require('net').createConnection(common.PORT, 'localhost'); +conn.resume(); +conn.resume(); +conn.pause(); +conn.on('data', onDataError); +scheduleTearDown(conn); + + +// Client helper functions +function onDataError() { + assert(false); +} + +function onDataOk() { + dataEvents++; +} + +function scheduleTearDown(conn) { + setTimeout(function() { + conn.removeAllListeners('data'); + conn.resume(); + }, 100); +} + + +// Exit sanity checks +process.on('exit', function() { + assert.strictEqual(connections, 5); + assert.strictEqual(dataEvents, 3); +}); diff --git a/test/simple/test-net-socket-pause-resume-immediate.js b/test/simple/test-net-socket-pause-resume-immediate.js deleted file mode 100644 index 0622d071a7..0000000000 --- a/test/simple/test-net-socket-pause-resume-immediate.js +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var common = require('../common'); -var assert = require('assert'); -var net = require('net'); - -var sock = net.connect(1234, 'localhost'); -sock.pause(); -sock.resume(); -console.log('ok'); -process.exit(0);