'use strict'; const common = require('../common'); const assert = require('assert'); const http = require('http'); const { duplexPair } = require('stream'); // Regression test for the crash reported in // https://github.com/nodejs/node/issues/15102 (httpParser.finish() is called // during httpParser.execute()): { const [ clientSide, serverSide ] = duplexPair(); serverSide.on('data', common.mustCall((data) => { assert.strictEqual(data.toString('utf8'), `\ GET / HTTP/1.1 Expect: 100-continue Host: localhost:80 Connection: close `.replace(/\n/g, '\r\n')); setImmediate(() => { serverSide.write('HTTP/1.1 100 Continue\r\n\r\n'); }); })); const req = http.request({ createConnection: common.mustCall(() => clientSide), headers: { 'Expect': '100-continue' } }); req.on('continue', common.mustCall((res) => { let sync = true; clientSide._writev = null; clientSide._write = common.mustCall((chunk, enc, cb) => { assert(sync); // On affected versions of Node.js, the error would be emitted on `req` // synchronously (i.e. before commit f663b31cc2aec), which would cause // parser.finish() to be called while we are here in the 'continue' // callback, which is inside a parser.execute() call. assert.strictEqual(chunk.length, 4); clientSide.destroy(new Error('sometimes the code just doesn’t work'), cb); }); req.on('error', common.mustCall()); req.end('data'); sync = false; })); }