@@ -4,6 +4,7 @@ const common = require('../common');
44const assert = require ( 'assert' ) ;
55const { createServer } = require ( 'http' ) ;
66const { connect } = require ( 'net' ) ;
7+ const { promisify } = require ( 'util' ) ;
78
89// This test validates that request are correct checked for both requests and headers timeout in various situations.
910
@@ -16,10 +17,13 @@ const responseTimeout = 'HTTP/1.1 408 Request Timeout\r\n';
1617
1718const headersTimeout = common . platformTimeout ( 2000 ) ;
1819const connectionsCheckingInterval = headersTimeout / 4 ;
20+ const requestTimeout = headersTimeout * 2 ;
21+ const threadSleepDelay = requestTimeout + headersTimeout ;
22+ const delay = promisify ( setTimeout ) ;
1923
2024const server = createServer ( {
2125 headersTimeout,
22- requestTimeout : headersTimeout * 2 ,
26+ requestTimeout,
2327 keepAliveTimeout : 0 ,
2428 connectionsCheckingInterval
2529} , common . mustCall ( ( req , res ) => {
@@ -32,7 +36,7 @@ const server = createServer({
3236} , 4 ) ) ;
3337
3438assert . strictEqual ( server . headersTimeout , headersTimeout ) ;
35- assert . strictEqual ( server . requestTimeout , headersTimeout * 2 ) ;
39+ assert . strictEqual ( server . requestTimeout , requestTimeout ) ;
3640
3741let i = 0 ;
3842function createClient ( server ) {
@@ -58,74 +62,48 @@ function createClient(server) {
5862 return request ;
5963}
6064
61- server . listen ( 0 , common . mustCall ( ( ) => {
65+ server . listen ( 0 , common . mustCall ( async ( ) => {
66+ // Create first and second request and set headers
6267 const request1 = createClient ( server ) ;
63- let request2 ;
64- let request3 ;
65- let request4 ;
66- let request5 ;
67-
68- // Send the first request and stop before the body
68+ const request2 = createClient ( server ) ;
6969 request1 . client . write ( requestBodyPart1 ) ;
70-
71- // After a little while send two new requests
72- setTimeout ( ( ) => {
73- request2 = createClient ( server ) ;
74- request3 = createClient ( server ) ;
75-
76- // Send the second request, stop in the middle of the headers
77- request2 . client . write ( requestBodyPart1 ) ;
78- // Send the second request, stop in the middle of the headers
79- request3 . client . write ( requestBodyPart1 ) ;
80- } , headersTimeout * 0.2 ) ;
81-
82- // After another little while send the last two new requests
83- setTimeout ( ( ) => {
84- request4 = createClient ( server ) ;
85- request5 = createClient ( server ) ;
86-
87- // Send the fourth request, stop in the middle of the headers
88- request4 . client . write ( requestBodyPart1 ) ;
89- // Send the fifth request, stop in the middle of the headers
90- request5 . client . write ( requestBodyPart1 ) ;
91- } , headersTimeout * 0.6 ) ;
92-
93- setTimeout ( ( ) => {
94- // Finish the first request
95- request1 . client . write ( requestBodyPart2 + requestBodyPart3 ) ;
96-
97- // Complete headers for all requests but second
98- request3 . client . write ( requestBodyPart2 ) ;
99- request4 . client . write ( requestBodyPart2 ) ;
100- request5 . client . write ( requestBodyPart2 ) ;
101- } , headersTimeout * 0.8 ) ;
102-
103- setTimeout ( ( ) => {
104- // After the first timeout, the first request should have been completed and second timedout
105- assert ( request1 . completed ) ;
106- assert ( request2 . completed ) ;
107- assert ( ! request3 . completed ) ;
108- assert ( ! request4 . completed ) ;
109- assert ( ! request5 . completed ) ;
110-
111- assert ( request1 . response . startsWith ( responseOk ) ) ;
112- assert ( request2 . response . startsWith ( responseTimeout ) ) ; // It is expired due to headersTimeout
113- } , headersTimeout * 1.2 + connectionsCheckingInterval ) ;
114-
115- setTimeout ( ( ) => {
116- // Complete the body for the fourth request
117- request4 . client . write ( requestBodyPart3 ) ;
118- } , headersTimeout * 1.5 ) ;
119-
120- setTimeout ( ( ) => {
121- // All request should be completed now, either with 200 or 408
122- assert ( request3 . completed ) ;
123- assert ( request4 . completed ) ;
124- assert ( request5 . completed ) ;
125-
126- assert ( request3 . response . startsWith ( responseTimeout ) ) ; // It is expired due to requestTimeout
127- assert ( request4 . response . startsWith ( responseOk ) ) ;
128- assert ( request5 . response . startsWith ( responseTimeout ) ) ; // It is expired due to requestTimeout
129- server . close ( ) ;
130- } , headersTimeout * 3 + connectionsCheckingInterval ) ;
70+ request2 . client . write ( requestBodyPart1 ) ;
71+
72+ // Finish the first request now and wait more than the request timeout value
73+ request1 . client . write ( requestBodyPart2 + requestBodyPart3 ) ;
74+ await delay ( threadSleepDelay ) ;
75+
76+ // First and second request should complete now
77+ assert ( request1 . completed ) ;
78+ assert ( request2 . completed ) ; // Completed, but a timeout request
79+
80+ assert ( request1 . response . startsWith ( responseOk ) ) ;
81+ assert ( request2 . response . startsWith ( responseTimeout ) ) ; // Reques expired due to headersTimeout
82+
83+ // Create another 3 requests with headers
84+ const request3 = createClient ( server ) ;
85+ const request4 = createClient ( server ) ;
86+ const request5 = createClient ( server ) ;
87+ request3 . client . write ( requestBodyPart1 + requestBodyPart2 ) ;
88+ request4 . client . write ( requestBodyPart1 + requestBodyPart2 ) ;
89+ request5 . client . write ( requestBodyPart1 + requestBodyPart2 ) ;
90+
91+ // None of the requests will be completed because they only recieved headers
92+ assert ( ! request3 . completed ) ;
93+ assert ( ! request4 . completed ) ;
94+ assert ( ! request5 . completed ) ;
95+
96+ // Finish the fourth request now and wait more than the request timeout value
97+ request4 . client . write ( requestBodyPart3 ) ;
98+ await delay ( threadSleepDelay ) ;
99+
100+ // All three requests should complete now
101+ assert ( request3 . completed ) ;
102+ assert ( request4 . completed ) ;
103+ assert ( request5 . completed ) ;
104+
105+ assert ( request3 . response . startsWith ( responseTimeout ) ) ; // It is expired due to headersTimeout
106+ assert ( request4 . response . startsWith ( responseOk ) ) ;
107+ assert ( request5 . response . startsWith ( responseTimeout ) ) ; // It is expired due to headersTimeout
108+ server . close ( ) ;
131109} ) ) ;
0 commit comments