1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const net = require('net'); 5const http = require('http'); 6 7// These test cases to check socketOnDrain where needPause becomes false. 8// When send large response enough to exceed highWaterMark, it expect the socket 9// to be paused and res.write would be failed. 10// And it should be resumed when outgoingData falls below highWaterMark. 11 12let requestReceived = 0; 13 14const server = http.createServer(function(req, res) { 15 const id = ++requestReceived; 16 const enoughToDrain = req.connection.writableHighWaterMark; 17 const body = 'x'.repeat(enoughToDrain * 100); 18 19 if (id === 1) { 20 // Case of needParse = false 21 req.connection.once('pause', common.mustCall(() => { 22 assert(req.connection._paused, '_paused must be true because it exceeds' + 23 'highWaterMark by second request'); 24 })); 25 } else { 26 // Case of needParse = true 27 const resume = req.connection.parser.resume.bind(req.connection.parser); 28 req.connection.parser.resume = common.mustCall((...args) => { 29 const paused = req.connection._paused; 30 assert(!paused, '_paused must be false because it become false by ' + 31 'socketOnDrain when outgoingData falls below ' + 32 'highWaterMark'); 33 return resume(...args); 34 }); 35 } 36 assert(!res.write(body), 'res.write must return false because it will ' + 37 'exceed highWaterMark on this call'); 38 res.end(); 39}).on('listening', () => { 40 const c = net.createConnection(server.address().port, () => { 41 c.write('GET / HTTP/1.1\r\n\r\n'); 42 c.write('GET / HTTP/1.1\r\n\r\n', 43 () => setImmediate(() => c.resume())); 44 c.end(); 45 }); 46 47 c.on('end', () => { 48 server.close(); 49 }); 50}); 51 52server.listen(0); 53