Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

http: fix missing 'drain' events

  • Loading branch information...
commit 7276ff982216a3dfbdc8f9fd3b525f12372cf157 1 parent ea9f5b1
@russellhaering russellhaering authored ry committed
Showing with 75 additions and 0 deletions.
  1. +2 −0  lib/http.js
  2. +73 −0 test/simple/test-pipe-file-to-http.js
View
2  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;
}
View
73 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);
+});
Please sign in to comment.
Something went wrong with that request. Please try again.