54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
|
'use strict';
|
|||
|
const common = require('../common');
|
|||
|
const assert = require('assert');
|
|||
|
const http = require('http');
|
|||
|
const MakeDuplexPair = require('../common/duplexpair');
|
|||
|
|
|||
|
// Regression test for the crash reported in
|
|||
|
// https://github.com/nodejs/node/issues/15102 (httpParser.finish() is called
|
|||
|
// during httpParser.execute()):
|
|||
|
|
|||
|
{
|
|||
|
const { clientSide, serverSide } = MakeDuplexPair();
|
|||
|
|
|||
|
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, 0);
|
|||
|
clientSide.destroy(new Error('sometimes the code just doesn’t work'), cb);
|
|||
|
});
|
|||
|
req.on('error', common.mustCall());
|
|||
|
req.end();
|
|||
|
|
|||
|
sync = false;
|
|||
|
}));
|
|||
|
}
|