| '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()); |
| }); |