'use strict'; // http://groups.google.com/group/nodejs/browse_thread/thread/f66cd3c960406919 const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); if (process.argv[2] === 'request') { const http = require('http'); const options = { port: +process.argv[3], path: '/' }; http.get(options, (res) => { res.pipe(process.stdout); }); return; } if (process.argv[2] === 'shasum') { const crypto = require('crypto'); const shasum = crypto.createHash('sha1'); process.stdin.on('data', (d) => { shasum.update(d); }); process.stdin.on('close', () => { process.stdout.write(shasum.digest('hex')); }); return; } const http = require('http'); const cp = require('child_process'); const tmpdir = require('../common/tmpdir'); const filename = require('path').join(tmpdir.path, 'big'); let server; function executeRequest(cb) { cp.exec([`"${process.execPath}"`, `"${__filename}"`, 'request', server.address().port, '|', `"${process.execPath}"`, `"${__filename}"`, 'shasum' ].join(' '), (err, stdout, stderr) => { if (stderr.trim() !== '') { console.log(stderr); } assert.ifError(err); assert.strictEqual(stdout.slice(0, 40), '8c206a1a87599f532ce68675536f0b1546900d7a'); cb(); } ); } tmpdir.refresh(); common.createZeroFilledFile(filename); server = http.createServer(function(req, res) { res.writeHead(200); // Create the subprocess const cat = cp.spawn('cat', [filename]); // Stream the data through to the response as binary chunks cat.stdout.on('data', (data) => { res.write(data); }); cat.stdout.on('end', () => res.end()); // End the response on exit (and log errors) cat.on('exit', (code) => { if (code !== 0) { console.error(`subprocess exited with code ${code}`); process.exit(1); } }); }); server.listen(0, () => { executeRequest(() => server.close()); });