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