http: fix missing 'drain' events
authorRussell Haering <russellhaering@gmail.com>
Sun, 20 Feb 2011 00:00:05 +0000 (16:00 -0800)
committerRyan Dahl <ry@tinyclouds.org>
Fri, 25 Feb 2011 01:39:59 +0000 (17:39 -0800)
lib/http.js
test/simple/test-pipe-file-to-http.js [new file with mode: 0644]

index bd0aec9..98a9ab9 100644 (file)
@@ -731,6 +731,7 @@ OutgoingMessage.prototype._flush = function() {
     // This is a queue to the server or client to bring in the next this.
     this._finish();
   } else if (ret) {
+    // This is necessary to prevent https from breaking
     this.emit('drain');
   }
 };
@@ -1347,6 +1348,7 @@ Agent.prototype._cycle = function() {
       first._queue = null;
 
       first.assignSocket(socket);
+      httpSocketSetup(socket);
       self._cycle(); // try to dispatch another
       return;
     }
diff --git a/test/simple/test-pipe-file-to-http.js b/test/simple/test-pipe-file-to-http.js
new file mode 100644 (file)
index 0000000..0565232
--- /dev/null
@@ -0,0 +1,73 @@
+var common = require('../common');
+var assert = require('assert');
+var fs = require('fs');
+var http = require('http');
+var path = require('path');
+var cp = require('child_process');
+
+var filename = path.join(common.tmpDir || '/tmp', 'big');
+var clientReqComplete = false;
+var count = 0;
+
+var server = http.createServer(function(req, res) {
+  var timeoutId;
+  assert.equal('POST', req.method);
+  req.pause();
+  common.error('request paused');
+
+  setTimeout(function() {
+    req.resume();
+    common.error('request resumed');
+  }, 1000);
+
+  req.on('data', function(chunk) {
+    common.error('recv data! nchars = ' + chunk.length);
+    count += chunk.length;
+  });
+
+  req.on('end', function() {
+    if (timeoutId) {
+      clearTimeout(timeoutId);
+    }
+    console.log('request complete from server');
+    res.writeHead(200, {'Content-Type': 'text/plain'});
+    res.end();
+  });
+});
+server.listen(common.PORT);
+
+server.on('listening', function() {
+  var cmd = 'dd if=/dev/zero of="' + filename + '" bs=1024 count=10240';
+  cp.exec(cmd, function(err, stdout, stderr) {
+    if (err) throw err;
+    makeRequest();
+  });
+});
+
+function makeRequest() {
+  var req = http.request({
+    port: common.PORT,
+    path: '/',
+    method: 'POST'
+  });
+
+  common.error('pipe!');
+  var s = fs.ReadStream(filename);
+  s.pipe(req);
+  s.on('close', function(err) {
+    if (err) throw err;
+    clientReqComplete = true;
+    common.error('client finished sending request');
+  });
+
+  req.on('response', function(res) {
+    res.on('end', function() {
+      server.close();
+    });
+  });
+}
+
+process.on('exit', function() {
+  assert.equal(1024 * 10240, count);
+  assert.ok(clientReqComplete);
+});