1'use strict'; 2const { expectsError, mustCall } = require('../common'); 3const assert = require('assert'); 4const { createServer, maxHeaderSize } = require('http'); 5const { createConnection } = require('net'); 6 7const CRLF = '\r\n'; 8const DUMMY_HEADER_NAME = 'Cookie: '; 9const DUMMY_HEADER_VALUE = 'a'.repeat( 10 // Plus one is to make it 1 byte too big 11 maxHeaderSize - DUMMY_HEADER_NAME.length - (2 * CRLF.length) + 1 12); 13const PAYLOAD_GET = 'GET /blah HTTP/1.1'; 14const PAYLOAD = PAYLOAD_GET + CRLF + 15 DUMMY_HEADER_NAME + DUMMY_HEADER_VALUE + CRLF.repeat(2); 16 17const server = createServer(); 18 19server.on('connection', mustCall((socket) => { 20 socket.on('error', expectsError({ 21 name: 'Error', 22 message: 'Parse Error: Header overflow', 23 code: 'HPE_HEADER_OVERFLOW', 24 bytesParsed: maxHeaderSize + PAYLOAD_GET.length, 25 rawPacket: Buffer.from(PAYLOAD) 26 })); 27})); 28 29server.listen(0, mustCall(() => { 30 const c = createConnection(server.address().port); 31 let received = ''; 32 33 c.on('connect', mustCall(() => { 34 c.write(PAYLOAD); 35 })); 36 c.on('data', mustCall((data) => { 37 received += data.toString(); 38 })); 39 c.on('end', mustCall(() => { 40 assert.strictEqual( 41 received, 42 'HTTP/1.1 431 Request Header Fields Too Large\r\n' + 43 'Connection: close\r\n\r\n' 44 ); 45 c.end(); 46 })); 47 c.on('close', mustCall(() => server.close())); 48})); 49