| 'use strict'; |
| // http://groups.google.com/group/nodejs/browse_thread/thread/f66cd3c960406919 |
| const common = require('../common'); |
| |
| if (!common.hasCrypto) { |
| common.skip('missing crypto'); |
| } |
| |
| const fs = require('fs'); |
| 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 = tmpdir.resolve('big'); |
| let server; |
| |
| function executeRequest(cb) { |
| // The execPath might contain chars that should be escaped in a shell context. |
| // On non-Windows, we can pass the path via the env; `"` is not a valid char on |
| // Windows, so we can simply pass the path. |
| const node = `"${common.isWindows ? process.execPath : '$NODE'}"`; |
| const file = `"${common.isWindows ? __filename : '$FILE'}"`; |
| const env = common.isWindows ? process.env : { ...process.env, NODE: process.execPath, FILE: __filename }; |
| cp.exec([node, |
| file, |
| 'request', |
| server.address().port, |
| '|', |
| node, |
| file, |
| 'shasum' ].join(' '), |
| { env }, |
| common.mustCall((err, stdout, stderr) => { |
| if (stderr.trim() !== '') { |
| console.log(stderr); |
| } |
| assert.ifError(err); |
| assert.strictEqual(stdout.slice(0, 40), |
| '8c206a1a87599f532ce68675536f0b1546900d7a'); |
| cb(); |
| }) |
| ); |
| } |
| |
| |
| tmpdir.refresh(); |
| |
| |
| // Create a zero-filled file. |
| const fd = fs.openSync(filename, 'w'); |
| fs.ftruncateSync(fd, 10 * 1024 * 1024); |
| fs.closeSync(fd); |
| |
| 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()); |
| }); |