mirror of
https://github.com/zebrajr/node.git
synced 2025-12-06 12:20:27 +01:00
This test setups two event listeners: one on a child process' exit event , another for the same child process' stdandard output's 'data' event. The data even listener writes to a stream, and the exit event listener ends it. Because the exit event can be emitted before the data event, there is a chance that something will be written to the stream after it's ended, and that an error is thrown. This change makes the test end the stream in the listener for the child process' standard output's end event, which is guaranteed to be emitted after the last data event, thus avoiding the race. PR: #9301 PR-URL: https://github.com/joyent/node/pull/9301 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: James M Snell <jasnell@users.noreply.github.com> Reviewed-By: Bert Belder <bertbelder@gmail.com>
89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
// 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.
|
|
|
|
if (!process.versions.openssl) {
|
|
console.error('Skipping because node compiled without OpenSSL.');
|
|
process.exit(0);
|
|
}
|
|
|
|
// http://groups.google.com/group/nodejs/browse_thread/thread/f66cd3c960406919
|
|
var common = require('../common');
|
|
var assert = require('assert');
|
|
var http = require('http');
|
|
var cp = require('child_process');
|
|
var fs = require('fs');
|
|
|
|
var filename = require('path').join(common.tmpDir, 'big');
|
|
|
|
var count = 0;
|
|
function maybeMakeRequest() {
|
|
if (++count < 2) return;
|
|
console.log('making curl request');
|
|
var cmd = 'curl http://127.0.0.1:' + common.PORT + '/ | openssl sha1';
|
|
cp.exec(cmd, function(err, stdout, stderr) {
|
|
if (err) throw err;
|
|
var hex = stdout.match(/([A-Fa-f0-9]{40})/)[0];
|
|
assert.equal('8c206a1a87599f532ce68675536f0b1546900d7a', hex);
|
|
console.log('got the correct response');
|
|
fs.unlink(filename);
|
|
server.close();
|
|
});
|
|
}
|
|
|
|
|
|
var ddcmd = common.ddCommand(filename, 10240);
|
|
console.log('dd command: ', ddcmd);
|
|
|
|
cp.exec(ddcmd, function(err, stdout, stderr) {
|
|
if (err) throw err;
|
|
maybeMakeRequest();
|
|
});
|
|
|
|
|
|
var server = http.createServer(function(req, res) {
|
|
res.writeHead(200);
|
|
|
|
// Create the subprocess
|
|
var cat = cp.spawn('cat', [filename]);
|
|
|
|
// Stream the data through to the response as binary chunks
|
|
cat.stdout.on('data', function(data) {
|
|
res.write(data);
|
|
});
|
|
|
|
cat.stdout.on('end', function onStdoutEnd() {
|
|
res.end();
|
|
});
|
|
|
|
// End the response on exit (and log errors)
|
|
cat.on('exit', function(code) {
|
|
if (code !== 0) {
|
|
console.error('subprocess exited with code ' + code);
|
|
process.exit(1);
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
server.listen(common.PORT, maybeMakeRequest);
|
|
|
|
console.log('Server running at http://localhost:8080');
|