mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
b41ab9d116
PR-URL: https://github.com/nodejs/node/pull/45722 Fixes: https://github.com/nodejs/node/issues/43465 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Paolo Insogna <paolo@cowtech.it> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
134 lines
4.0 KiB
JavaScript
134 lines
4.0 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const { createServer } = require('http');
|
|
const { connect } = require('net');
|
|
|
|
// This test validates that request are correct checked for both requests and headers timeout in various situations.
|
|
|
|
const requestBodyPart1 = 'POST / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 20\r\n';
|
|
const requestBodyPart2 = 'Connection: close\r\n\r\n1234567890';
|
|
const requestBodyPart3 = '1234567890';
|
|
|
|
const responseOk = 'HTTP/1.1 200 OK\r\n';
|
|
const responseTimeout = 'HTTP/1.1 408 Request Timeout\r\n';
|
|
|
|
const headersTimeout = common.platformTimeout(2000);
|
|
const connectionsCheckingInterval = headersTimeout / 8;
|
|
|
|
const server = createServer({
|
|
headersTimeout,
|
|
requestTimeout: headersTimeout * 2,
|
|
keepAliveTimeout: 0,
|
|
connectionsCheckingInterval
|
|
}, common.mustCall((req, res) => {
|
|
req.resume();
|
|
|
|
req.on('end', () => {
|
|
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
res.end();
|
|
});
|
|
}, 4));
|
|
|
|
assert.strictEqual(server.headersTimeout, headersTimeout);
|
|
assert.strictEqual(server.requestTimeout, headersTimeout * 2);
|
|
|
|
let i = 0;
|
|
function createClient(server) {
|
|
const request = {
|
|
index: i++,
|
|
client: connect(server.address().port),
|
|
response: '',
|
|
completed: false
|
|
};
|
|
|
|
request.client.setEncoding('utf8');
|
|
request.client.on('data', common.mustCallAtLeast((chunk) => {
|
|
request.response += chunk;
|
|
}));
|
|
|
|
request.client.on('end', common.mustCall(() => {
|
|
request.completed = true;
|
|
}));
|
|
|
|
request.client.on('error', common.mustNotCall());
|
|
|
|
request.client.resume();
|
|
|
|
return request;
|
|
}
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
const request1 = createClient(server);
|
|
let request2;
|
|
let request3;
|
|
let request4;
|
|
let request5;
|
|
|
|
// Send the first request and stop before the body
|
|
request1.client.write(requestBodyPart1);
|
|
|
|
// After a little while send two new requests
|
|
setTimeout(() => {
|
|
request2 = createClient(server);
|
|
request3 = createClient(server);
|
|
|
|
// Send the second request, stop in the middle of the headers
|
|
request2.client.write(requestBodyPart1);
|
|
|
|
// Send the third request and stop in the middle of the headers
|
|
request3.client.write(requestBodyPart1);
|
|
}, headersTimeout * 0.2);
|
|
|
|
// After another little while send the last two new requests
|
|
setTimeout(() => {
|
|
request4 = createClient(server);
|
|
request5 = createClient(server);
|
|
|
|
// Send the fourth request, stop in the middle of the headers
|
|
request4.client.write(requestBodyPart1);
|
|
// Send the fifth request, stop in the middle of the headers
|
|
request5.client.write(requestBodyPart1);
|
|
}, headersTimeout * 0.6);
|
|
|
|
setTimeout(() => {
|
|
// Finish the first request
|
|
request1.client.write(requestBodyPart2 + requestBodyPart3);
|
|
|
|
// Complete headers for all requests but second
|
|
request3.client.write(requestBodyPart2);
|
|
request4.client.write(requestBodyPart2);
|
|
request5.client.write(requestBodyPart2);
|
|
}, headersTimeout * 0.8);
|
|
|
|
setTimeout(() => {
|
|
// After the first timeout, the first request should have been completed and second timedout
|
|
assert(request1.completed);
|
|
assert(request2.completed);
|
|
assert(!request3.completed);
|
|
assert(!request4.completed);
|
|
assert(!request5.completed);
|
|
|
|
assert(request1.response.startsWith(responseOk));
|
|
assert(request2.response.startsWith(responseTimeout)); // It is expired due to headersTimeout
|
|
}, headersTimeout * 1.4);
|
|
|
|
setTimeout(() => {
|
|
// Complete the body for the fourth request
|
|
request4.client.write(requestBodyPart3);
|
|
}, headersTimeout * 1.5);
|
|
|
|
setTimeout(() => {
|
|
// All request should be completed now, either with 200 or 408
|
|
assert(request3.completed);
|
|
assert(request4.completed);
|
|
assert(request5.completed);
|
|
|
|
assert(request3.response.startsWith(responseTimeout)); // It is expired due to requestTimeout
|
|
assert(request4.response.startsWith(responseOk));
|
|
assert(request5.response.startsWith(responseTimeout)); // It is expired due to requestTimeout
|
|
server.close();
|
|
}, headersTimeout * 3 + connectionsCheckingInterval);
|
|
}));
|