net: fix large file downloads failing
authorkoichik <koichik@improvement.jp>
Fri, 3 Feb 2012 11:09:30 +0000 (20:09 +0900)
committerkoichik <koichik@improvement.jp>
Sun, 5 Feb 2012 08:41:49 +0000 (17:41 +0900)
Fixes #2678.

lib/net.js
test/simple/test-net-write-slow.js [new file with mode: 0644]

index bdd5ba8..48129a9 100644 (file)
@@ -481,7 +481,7 @@ function afterWrite(status, handle, req, buffer) {
     return;
   }
 
-  timers.active(this);
+  timers.active(self);
 
   self._pendingWriteReqs--;
 
diff --git a/test/simple/test-net-write-slow.js b/test/simple/test-net-write-slow.js
new file mode 100644 (file)
index 0000000..ddb35c0
--- /dev/null
@@ -0,0 +1,60 @@
+// 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 SIZE = 1E5;
+var N = 10;
+var received = 0;
+var buf = new Buffer(SIZE);
+buf.fill(0x61); // 'a'
+
+var server = net.createServer(function(socket) {
+  socket.setNoDelay();
+  socket.setTimeout(500);
+  socket.on('timeout', function() {
+    assert.fail();
+  });
+
+  for (var i = 0; i < N; ++i) {
+    socket.write(buf);
+  }
+  socket.end();
+
+}).listen(common.PORT, function() {
+  var conn = net.connect(common.PORT);
+  conn.on('data', function(buf) {
+    received += buf.length;
+    conn.pause();
+    setTimeout(function() {
+      conn.resume();
+    }, 50);
+  });
+  conn.on('end', function() {
+    server.close();
+  });
+});
+
+process.on('exit', function() {
+  assert.equal(received, SIZE * N);
+});