diff --git a/lib/http.js b/lib/http.js index bd0aec972cf..98a9ab9c874 100644 --- a/lib/http.js +++ b/lib/http.js @@ -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 index 00000000000..05652326632 --- /dev/null +++ b/test/simple/test-pipe-file-to-http.js @@ -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); +});