-
Notifications
You must be signed in to change notification settings - Fork 30k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PR-URL: #42893 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Co-authored-by: Luigi Pinca <luigipinca@gmail.com>
- Loading branch information
Showing
11 changed files
with
153 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
131 changes: 131 additions & 0 deletions
131
test/parallel/test-http-server-request-timeouts-mixed.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
'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.on('data', common.mustCallAtLeast((chunk) => { | ||
request.response += chunk.toString('utf-8'); | ||
})); | ||
|
||
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); | ||
})); |