@@ -4,6 +4,7 @@ const common = require('../common');
4
4
const assert = require ( 'assert' ) ;
5
5
const { createServer } = require ( 'http' ) ;
6
6
const { connect } = require ( 'net' ) ;
7
+ const { promisify } = require ( 'util' ) ;
7
8
8
9
// This test validates that request are correct checked for both requests and headers timeout in various situations.
9
10
@@ -16,10 +17,13 @@ const responseTimeout = 'HTTP/1.1 408 Request Timeout\r\n';
16
17
17
18
const headersTimeout = common . platformTimeout ( 2000 ) ;
18
19
const connectionsCheckingInterval = headersTimeout / 4 ;
20
+ const requestTimeout = headersTimeout * 2 ;
21
+ const threadSleepDelay = requestTimeout + headersTimeout ;
22
+ const delay = promisify ( setTimeout ) ;
19
23
20
24
const server = createServer ( {
21
25
headersTimeout,
22
- requestTimeout : headersTimeout * 2 ,
26
+ requestTimeout,
23
27
keepAliveTimeout : 0 ,
24
28
connectionsCheckingInterval
25
29
} , common . mustCall ( ( req , res ) => {
@@ -32,7 +36,7 @@ const server = createServer({
32
36
} , 4 ) ) ;
33
37
34
38
assert . strictEqual ( server . headersTimeout , headersTimeout ) ;
35
- assert . strictEqual ( server . requestTimeout , headersTimeout * 2 ) ;
39
+ assert . strictEqual ( server . requestTimeout , requestTimeout ) ;
36
40
37
41
let i = 0 ;
38
42
function createClient ( server ) {
@@ -58,74 +62,48 @@ function createClient(server) {
58
62
return request ;
59
63
}
60
64
61
- server . listen ( 0 , common . mustCall ( ( ) => {
65
+ server . listen ( 0 , common . mustCall ( async ( ) => {
66
+ // Create first and second request and set headers
62
67
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 ) ;
69
69
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 ( ) ;
131
109
} ) ) ;
0 commit comments