1'use strict'; 2 3const common = require('../common'); 4const net = require('net'); 5const http = require('http'); 6const assert = require('assert'); 7 8const bodySent = 'This is my request'; 9 10function assertResponse(headers, body, expectClosed) { 11 if (expectClosed) { 12 assert.match(headers, /Connection: close\r\n/m); 13 assert.strictEqual(headers.search(/Keep-Alive: timeout=5, max=3\r\n/m), -1); 14 assert.match(body, /Hello World!/m); 15 } else { 16 assert.match(headers, /Connection: keep-alive\r\n/m); 17 assert.match(headers, /Keep-Alive: timeout=5, max=3\r\n/m); 18 assert.match(body, /Hello World!/m); 19 } 20} 21 22function writeRequest(socket) { 23 socket.write('POST / HTTP/1.1\r\n'); 24 socket.write('Connection: keep-alive\r\n'); 25 socket.write('Content-Type: text/plain\r\n'); 26 socket.write(`Content-Length: ${bodySent.length}\r\n\r\n`); 27 socket.write(`${bodySent}\r\n`); 28 socket.write('\r\n\r\n'); 29} 30 31const server = http.createServer((req, res) => { 32 let body = ''; 33 req.on('data', (data) => { 34 body += data; 35 }); 36 37 req.on('end', () => { 38 if (req.method === 'POST') { 39 assert.strictEqual(bodySent, body); 40 } 41 42 res.writeHead(200, { 'Content-Type': 'text/plain' }); 43 res.write('Hello World!'); 44 res.end(); 45 }); 46}); 47 48server.maxRequestsPerSocket = 3; 49 50server.listen(0, common.mustCall((res) => { 51 const socket = new net.Socket(); 52 53 socket.on('end', common.mustCall(() => { 54 server.close(); 55 })); 56 57 socket.on('ready', common.mustCall(() => { 58 writeRequest(socket); 59 writeRequest(socket); 60 writeRequest(socket); 61 writeRequest(socket); 62 })); 63 64 let buffer = ''; 65 66 socket.on('data', (data) => { 67 buffer += data; 68 69 const responseParts = buffer.trim().split('\r\n\r\n'); 70 71 if (responseParts.length === 8) { 72 assertResponse(responseParts[0], responseParts[1]); 73 assertResponse(responseParts[2], responseParts[3]); 74 assertResponse(responseParts[4], responseParts[5], true); 75 76 assert.match(responseParts[6], /HTTP\/1\.1 503 Service Unavailable/m); 77 assert.match(responseParts[6], /Connection: close\r\n/m); 78 assert.strictEqual(responseParts[6].search(/Keep-Alive: timeout=5\r\n/m), -1); 79 assert.strictEqual(responseParts[7].search(/Hello World!/m), -1); 80 81 socket.end(); 82 } 83 }); 84 85 socket.connect({ port: server.address().port }); 86})); 87