| '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\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 / 4; |
| |
| 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 second request, 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.2 + connectionsCheckingInterval); |
| |
| 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); |
| })); |