// Flags: --expose-internals 'use strict'; const { expectsError, mustCall } = require('../common'); const assert = require('assert'); const { createServer, maxHeaderSize } = require('http'); const { createConnection } = require('net'); const { getOptionValue } = require('internal/options'); const CRLF = '\r\n'; const DUMMY_HEADER_NAME = 'Cookie: '; const DUMMY_HEADER_VALUE = 'a'.repeat( // Plus one is to make it 1 byte too big maxHeaderSize - DUMMY_HEADER_NAME.length - (2 * CRLF.length) + 1 ); const PAYLOAD_GET = 'GET /blah HTTP/1.1'; const PAYLOAD = PAYLOAD_GET + CRLF + DUMMY_HEADER_NAME + DUMMY_HEADER_VALUE + CRLF.repeat(2); const server = createServer(); server.on('connection', mustCall((socket) => { // Legacy parser gives sligthly different response. // This discripancy is not fixed on purpose. const legacy = getOptionValue('--http-parser') === 'legacy'; socket.on('error', expectsError({ type: Error, message: 'Parse Error: Header overflow', code: 'HPE_HEADER_OVERFLOW', bytesParsed: maxHeaderSize + PAYLOAD_GET.length - (legacy ? -1 : 0), rawPacket: Buffer.from(PAYLOAD) })); })); server.listen(0, mustCall(() => { const c = createConnection(server.address().port); let received = ''; c.on('connect', mustCall(() => { c.write(PAYLOAD); })); c.on('data', mustCall((data) => { received += data.toString(); })); c.on('end', mustCall(() => { assert.strictEqual( received, 'HTTP/1.1 431 Request Header Fields Too Large\r\n' + 'Connection: close\r\n\r\n' ); c.end(); })); c.on('close', mustCall(() => server.close())); }));