nodejs/test/parallel/test-http-sync-write-error-during-continue.js

54 lines
1.5 KiB
JavaScript
Raw Permalink Normal View History

'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 doesnt work'), cb);
});
req.on('error', common.mustCall());
req.end('data');
sync = false;
}));
}