test: check socketOnDrain where needPause is false
Adds a tests that checks if we can start reading again from a socket backing an incoming http request. PR-URL: https://github.com/nodejs/node/pull/17654 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
This commit is contained in:
parent
e20af3371b
commit
a364e7efbd
52
test/parallel/test-http-hightwatermark.js
Normal file
52
test/parallel/test-http-hightwatermark.js
Normal file
@ -0,0 +1,52 @@
|
||||
'use strict';
|
||||
const common = require('../common');
|
||||
const assert = require('assert');
|
||||
const net = require('net');
|
||||
const http = require('http');
|
||||
|
||||
// These test cases to check socketOnDrain where needPause becomes false.
|
||||
// When send large response enough to exceed highWaterMark, it expect the socket
|
||||
// to be paused and res.write would be failed.
|
||||
// And it should be resumed when outgoingData falls below highWaterMark.
|
||||
|
||||
let requestReceived = 0;
|
||||
|
||||
const server = http.createServer(function(req, res) {
|
||||
const id = ++requestReceived;
|
||||
const enoughToDrain = req.connection.writableHighWaterMark;
|
||||
const body = 'x'.repeat(enoughToDrain);
|
||||
|
||||
if (id === 1) {
|
||||
// Case of needParse = false
|
||||
req.connection.once('pause', common.mustCall(() => {
|
||||
assert(req.connection._paused, '_paused must be true because it exceeds' +
|
||||
'highWaterMark by second request');
|
||||
}));
|
||||
} else {
|
||||
// Case of needParse = true
|
||||
const resume = req.connection.parser.resume.bind(req.connection.parser);
|
||||
req.connection.parser.resume = common.mustCall((...args) => {
|
||||
const paused = req.connection._paused;
|
||||
assert(!paused, '_paused must be false because it become false by ' +
|
||||
'socketOnDrain when outgoingData falls below ' +
|
||||
'highWaterMark');
|
||||
return resume(...args);
|
||||
});
|
||||
}
|
||||
assert(!res.write(body), 'res.write must return false because it will ' +
|
||||
'exceed highWaterMark on this call');
|
||||
res.end();
|
||||
}).on('listening', () => {
|
||||
const c = net.createConnection(server.address().port, () => {
|
||||
c.write('GET / HTTP/1.1\r\n\r\n');
|
||||
c.write('GET / HTTP/1.1\r\n\r\n');
|
||||
c.end();
|
||||
});
|
||||
|
||||
c.on('data', () => {});
|
||||
c.on('end', () => {
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
|
||||
server.listen(0);
|
Loading…
x
Reference in New Issue
Block a user