1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
'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);
}));
|