diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-03-14 14:42:01 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-03-14 14:47:41 -0700 |
commit | 36e75b7351c483cdc8ae281e9c43278836ea94f8 (patch) | |
tree | 704e53c3431777ca89e48c51872289b93a13487c /test/simple | |
parent | 9d4c5a12f499fd59156e16efce17f019e16708d8 (diff) | |
download | node-new-36e75b7351c483cdc8ae281e9c43278836ea94f8.tar.gz |
Fix HTTP agent disconnection problem
https://groups.google.com/forum/#!topic/nodejs-dev/V5fB69hFa9o
Closes GH-787.
Diffstat (limited to 'test/simple')
-rw-r--r-- | test/simple/test-http-get-pipeline-problem.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/test/simple/test-http-get-pipeline-problem.js b/test/simple/test-http-get-pipeline-problem.js new file mode 100644 index 0000000000..5742372fec --- /dev/null +++ b/test/simple/test-http-get-pipeline-problem.js @@ -0,0 +1,87 @@ +// We are demonstrating a problem with http.get when queueing up many +// transfers. The server simply introduces some delay and sends a file. +// Note this is demonstarted with connection: close. +var common = require('../common'); +var assert = require('assert'); +var http = require('http'); +var fs = require('fs'); + +var image = fs.readFileSync(common.fixturesDir + '/person.jpg'); + +console.log("image.length = " + image.length); + +var total = 100; +var requests = 0, responses = 0; + +var server = http.Server(function(req, res) { + if (++requests == total) { + server.close(); + } + + setTimeout(function() { + res.writeHead(200, { + 'content-type': 'image/jpeg', + 'connection': 'close', + 'content-length': image.length + }); + res.end(image); + }, 1); +}); + + +server.listen(common.PORT, function() { + for (var i = 0; i < total; i++) { + (function() { + var x = i; + + var opts = { + port: common.PORT, + headers: { connection: 'close' } + }; + + http.get(opts, function(res) { + console.error("recv " + x); + var s = fs.createWriteStream(common.tmpDir + '/' + x + ".jpg"); + res.pipe(s); + + // TODO there should be a callback to pipe() that will allow + // us to get a callback when the pipe is finished. + res.on('end', function() { + console.error("done " + x); + if (++responses == total) { + s.on('close', checkFiles); + } + }); + }).on('error', function(e) { + console.error('error! ', e.message) + throw e; + }); + })(); + } +}); + + +var checkedFiles = false; +function checkFiles() { + // Should see 1.jpg, 2.jpg, ..., 100.jpg in tmpDir + var files = fs.readdirSync(common.tmpDir); + assert.equal(total, files.length); + + for (var i = 0; i < total; i++) { + var fn = i + '.jpg'; + assert.ok(files.indexOf(fn) >= 0, "couldn't find '" + fn + "'"); + var stat = fs.statSync(common.tmpDir + '/' + fn); + assert.equal(image.length, stat.size, + "size doesn't match on '" + fn + + "'. Got " + stat.size + " bytes"); + } + + checkedFiles = true; +} + + +process.on('exit', function() { + assert.equal(total, requests); + assert.equal(total, responses); + assert.ok(checkedFiles); +}); |