| // This test is designed to fail with a segmentation fault in Node.js 4.1.0 and |
| // execute without issues in Node.js 4.1.1 and up. |
| |
| // Flags: --expose-internals |
| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| const httpCommon = require('_http_common'); |
| const { HTTPParser } = require('_http_common'); |
| const net = require('net'); |
| |
| const COUNT = httpCommon.parsers.max + 1; |
| |
| const parsers = new Array(COUNT); |
| for (let i = 0; i < parsers.length; i++) |
| parsers[i] = httpCommon.parsers.alloc(); |
| |
| let gotRequests = 0; |
| let gotResponses = 0; |
| |
| function execAndClose() { |
| if (parsers.length === 0) |
| return; |
| process.stdout.write('.'); |
| |
| const parser = parsers.pop(); |
| parser.initialize(HTTPParser.RESPONSE, {}); |
| |
| const socket = net.connect(common.PORT); |
| socket.on('error', (e) => { |
| // If SmartOS and ECONNREFUSED, then retry. See |
| // https://github.com/nodejs/node/issues/2663. |
| if (common.isSunOS && e.code === 'ECONNREFUSED') { |
| parsers.push(parser); |
| parser.reused = true; |
| socket.destroy(); |
| setImmediate(execAndClose); |
| return; |
| } |
| throw e; |
| }); |
| |
| parser.consume(socket._handle); |
| |
| parser.onIncoming = function onIncoming() { |
| process.stdout.write('+'); |
| gotResponses++; |
| parser.unconsume(); |
| httpCommon.freeParser(parser); |
| socket.destroy(); |
| setImmediate(execAndClose); |
| }; |
| } |
| |
| const server = net.createServer(function(c) { |
| if (++gotRequests === COUNT) |
| server.close(); |
| c.end('HTTP/1.1 200 OK\r\n\r\n', function() { |
| c.destroySoon(); |
| }); |
| }).listen(common.PORT, execAndClose); |
| |
| process.on('exit', function() { |
| assert.strictEqual(gotResponses, COUNT); |
| }); |