@@ -5,6 +5,11 @@ const http = require('http');
5
5
const net = require ( 'net' ) ;
6
6
const assert = require ( 'assert' ) ;
7
7
8
+ // The maximum http chunk extension size is set in `src/node_http_parser.cc`.
9
+ // These tests assert that once the extension size is reached, an HTTP 413
10
+ // response is returned.
11
+ // Currently, the max size is set to 16KiB (16384).
12
+
8
13
// Verify that chunk extensions are limited in size when sent all together.
9
14
{
10
15
const server = http . createServer ( ( req , res ) => {
@@ -17,7 +22,8 @@ const assert = require('assert');
17
22
} ) ;
18
23
19
24
server . listen ( 0 , ( ) => {
20
- const sock = net . connect ( server . address ( ) . port ) ;
25
+ const port = server . address ( ) . port ;
26
+ const sock = net . connect ( port ) ;
21
27
let data = '' ;
22
28
23
29
sock . on ( 'data' , ( chunk ) => data += chunk . toString ( 'utf-8' ) ) ;
@@ -29,15 +35,17 @@ const assert = require('assert');
29
35
30
36
sock . end ( '' +
31
37
'GET / HTTP/1.1\r\n' +
32
- ' Host: localhost:8080 \r\n' +
38
+ ` Host: localhost:${ port } \r\n` +
33
39
'Transfer-Encoding: chunked\r\n\r\n' +
34
- '2;' + 'A' . repeat ( 20000 ) + '=bar\r\nAA\r\n' +
35
- '0\r\n\r\n'
40
+ '2;' + 'a' . repeat ( 17000 ) + '\r\n' + // Chunk size + chunk ext + CRLF
41
+ 'AA\r\n' + // Chunk data
42
+ '0\r\n' + // Last chunk
43
+ '\r\n' // End of http message
36
44
) ;
37
45
} ) ;
38
46
}
39
47
40
- // Verify that chunk extensions are limited in size when sent in intervals.
48
+ // Verify that chunk extensions are limited in size when sent in parts
41
49
{
42
50
const server = http . createServer ( ( req , res ) => {
43
51
req . on ( 'end' , ( ) => {
@@ -49,24 +57,10 @@ const assert = require('assert');
49
57
} ) ;
50
58
51
59
server . listen ( 0 , ( ) => {
52
- const sock = net . connect ( server . address ( ) . port ) ;
53
- let remaining = 20000 ;
60
+ const port = server . address ( ) . port ;
61
+ const sock = net . connect ( port ) ;
54
62
let data = '' ;
55
63
56
- const interval = setInterval (
57
- ( ) => {
58
- if ( remaining > 0 ) {
59
- sock . write ( 'A' . repeat ( 1000 ) ) ;
60
- } else {
61
- sock . write ( '=bar\r\nAA\r\n0\r\n\r\n' ) ;
62
- clearInterval ( interval ) ;
63
- }
64
-
65
- remaining -= 1000 ;
66
- } ,
67
- common . platformTimeout ( 20 ) ,
68
- ) . unref ( ) ;
69
-
70
64
sock . on ( 'data' , ( chunk ) => data += chunk . toString ( 'utf-8' ) ) ;
71
65
72
66
sock . on ( 'end' , common . mustCall ( function ( ) {
@@ -76,10 +70,20 @@ const assert = require('assert');
76
70
77
71
sock . write ( '' +
78
72
'GET / HTTP/1.1\r\n' +
79
- ' Host: localhost:8080 \r\n' +
73
+ ` Host: localhost:${ port } \r\n` +
80
74
'Transfer-Encoding: chunked\r\n\r\n' +
81
- '2;'
75
+ '2;' // Chunk size + start of chunk-extension
82
76
) ;
77
+
78
+ sock . write ( 'A' . repeat ( 8500 ) ) ; // Write half of the chunk-extension
79
+
80
+ queueMicrotask ( ( ) => {
81
+ sock . write ( 'A' . repeat ( 8500 ) + '\r\n' + // Remaining half of the chunk-extension
82
+ 'AA\r\n' + // Chunk data
83
+ '0\r\n' + // Last chunk
84
+ '\r\n' // End of http message
85
+ ) ;
86
+ } ) ;
83
87
} ) ;
84
88
}
85
89
@@ -95,7 +99,8 @@ const assert = require('assert');
95
99
} ) ;
96
100
97
101
server . listen ( 0 , ( ) => {
98
- const sock = net . connect ( server . address ( ) . port ) ;
102
+ const port = server . address ( ) . port ;
103
+ const sock = net . connect ( port ) ;
99
104
let data = '' ;
100
105
101
106
sock . on ( 'data' , ( chunk ) => data += chunk . toString ( 'utf-8' ) ) ;
@@ -120,7 +125,7 @@ const assert = require('assert');
120
125
121
126
sock . end ( '' +
122
127
'GET / HTTP/1.1\r\n' +
123
- ' Host: localhost:8080 \r\n' +
128
+ ` Host: localhost:${ port } \r\n` +
124
129
'Transfer-Encoding: chunked\r\n\r\n' +
125
130
'2;' + 'A' . repeat ( 10000 ) + '=bar\r\nAA\r\n' +
126
131
'2;' + 'A' . repeat ( 10000 ) + '=bar\r\nAA\r\n' +
0 commit comments