'use strict'; const fixtures = require('../../test/common/fixtures'); const https = require('https'); const options = { key: fixtures.readKey('rsa_private.pem'), cert: fixtures.readKey('rsa_cert.crt') }; const storedBytes = Object.create(null); const storedBuffer = Object.create(null); module.exports = https.createServer(options, (req, res) => { // URL format: ////chunkedEnc const params = req.url.split('/'); const command = params[1]; let body = ''; const arg = params[2]; const n_chunks = parseInt(params[3], 10); const chunkedEnc = params.length >= 5 && params[4] === '0' ? false : true; let status = 200; let n, i; if (command === 'bytes') { n = ~~arg; if (n <= 0) throw new Error('bytes called with n <= 0'); if (storedBytes[n] === undefined) { storedBytes[n] = 'C'.repeat(n); } body = storedBytes[n]; } else if (command === 'buffer') { n = ~~arg; if (n <= 0) throw new Error('buffer called with n <= 0'); if (storedBuffer[n] === undefined) { storedBuffer[n] = Buffer.allocUnsafe(n); for (i = 0; i < n; i++) { storedBuffer[n][i] = 'C'.charCodeAt(0); } } body = storedBuffer[n]; } else { status = 404; body = 'not found\n'; } // example: https://localhost:port/bytes/512/4 // sends a 512 byte body in 4 chunks of 128 bytes const len = body.length; if (chunkedEnc) { res.writeHead(status, { 'Content-Type': 'text/plain', 'Transfer-Encoding': 'chunked' }); } else { res.writeHead(status, { 'Content-Type': 'text/plain', 'Content-Length': len.toString() }); } // send body in chunks if (n_chunks > 1) { const step = Math.floor(len / n_chunks) || 1; for (i = 0, n = (n_chunks - 1); i < n; ++i) res.write(body.slice(i * step, i * step + step)); res.end(body.slice((n_chunks - 1) * step)); } else { res.end(body); } });