@@ -4,10 +4,14 @@ const common = require('../common');
44const assert = require ( 'assert' ) ;
55const http = require ( 'http' ) ;
66const net = require ( 'net' ) ;
7- const MAX = 8 * 1024 ; // 8KB
7+ const MAX = + ( process . argv [ 2 ] || 8 * 1024 ) ; // Command line option, or 8KB.
88
99const { getOptionValue } = require ( 'internal/options' ) ;
1010
11+ console . log ( 'pid is' , process . pid ) ;
12+ console . log ( 'max header size is' , getOptionValue ( '--max-http-header-size' ) ) ;
13+ console . log ( 'current http parser is' , getOptionValue ( '--http-parser' ) ) ;
14+
1115// Verify that we cannot receive more than 8KB of headers.
1216
1317function once ( cb ) {
@@ -38,19 +42,15 @@ function fillHeaders(headers, currentSize, valid = false) {
3842
3943 // Generate valid headers
4044 if ( valid ) {
41- // TODO(mcollina): understand why -9 is needed instead of -1
42- headers = headers . slice ( 0 , - 9 ) ;
45+ // TODO(mcollina): understand why -32 is needed instead of -1
46+ headers = headers . slice ( 0 , - 32 ) ;
4347 }
4448 return headers + '\r\n\r\n' ;
4549}
4650
47- const timeout = common . platformTimeout ( 10 ) ;
48-
4951function writeHeaders ( socket , headers ) {
5052 const array = [ ] ;
51-
52- // this is off from 1024 so that \r\n does not get split
53- const chunkSize = 1000 ;
53+ const chunkSize = 100 ;
5454 let last = 0 ;
5555
5656 for ( let i = 0 ; i < headers . length / chunkSize ; i ++ ) {
@@ -65,19 +65,25 @@ function writeHeaders(socket, headers) {
6565 next ( ) ;
6666
6767 function next ( ) {
68- if ( socket . write ( array . shift ( ) ) ) {
69- if ( array . length === 0 ) {
70- socket . end ( ) ;
71- } else {
72- setTimeout ( next , timeout ) ;
73- }
68+ if ( socket . destroyed ) {
69+ console . log ( 'socket was destroyed early, data left to write:' ,
70+ array . join ( '' ) . length ) ;
71+ return ;
72+ }
73+
74+ const chunk = array . shift ( ) ;
75+
76+ if ( chunk ) {
77+ console . log ( 'writing chunk of size' , chunk . length ) ;
78+ socket . write ( chunk , next ) ;
7479 } else {
75- socket . once ( 'drain' , next ) ;
80+ socket . end ( ) ;
7681 }
7782 }
7883}
7984
8085function test1 ( ) {
86+ console . log ( 'test1' ) ;
8187 let headers =
8288 'HTTP/1.1 200 OK\r\n' +
8389 'Content-Length: 0\r\n' +
@@ -92,6 +98,9 @@ function test1() {
9298 writeHeaders ( sock , headers ) ;
9399 sock . resume ( ) ;
94100 } ) ;
101+
102+ // The socket might error but that's ok
103+ sock . on ( 'error' , ( ) => { } ) ;
95104 } ) ;
96105
97106 server . listen ( 0 , common . mustCall ( ( ) => {
@@ -100,17 +109,17 @@ function test1() {
100109
101110 client . on ( 'error' , common . mustCall ( ( err ) => {
102111 assert . strictEqual ( err . code , 'HPE_HEADER_OVERFLOW' ) ;
103- server . close ( ) ;
104- setImmediate ( test2 ) ;
112+ server . close ( test2 ) ;
105113 } ) ) ;
106114 } ) ) ;
107115}
108116
109117const test2 = common . mustCall ( ( ) => {
118+ console . log ( 'test2' ) ;
110119 let headers =
111120 'GET / HTTP/1.1\r\n' +
112121 'Host: localhost\r\n' +
113- 'Agent: node \r\n' +
122+ 'Agent: nod2 \r\n' +
114123 'X-CRASH: ' ;
115124
116125 // /, Host, localhost, Agent, node, X-CRASH, a...
@@ -119,7 +128,7 @@ const test2 = common.mustCall(() => {
119128
120129 const server = http . createServer ( common . mustNotCall ( ) ) ;
121130
122- server . on ( 'clientError' , common . mustCall ( ( err ) => {
131+ server . once ( 'clientError' , common . mustCall ( ( err ) => {
123132 assert . strictEqual ( err . code , 'HPE_HEADER_OVERFLOW' ) ;
124133 } ) ) ;
125134
@@ -131,34 +140,46 @@ const test2 = common.mustCall(() => {
131140 } ) ;
132141
133142 finished ( client , common . mustCall ( ( err ) => {
134- server . close ( ) ;
135- setImmediate ( test3 ) ;
143+ server . close ( test3 ) ;
136144 } ) ) ;
137145 } ) ) ;
138146} ) ;
139147
140148const test3 = common . mustCall ( ( ) => {
149+ console . log ( 'test3' ) ;
141150 let headers =
142151 'GET / HTTP/1.1\r\n' +
143152 'Host: localhost\r\n' +
144- 'Agent: node \r\n' +
153+ 'Agent: nod3 \r\n' +
145154 'X-CRASH: ' ;
146155
147156 // /, Host, localhost, Agent, node, X-CRASH, a...
148157 const currentSize = 1 + 4 + 9 + 5 + 4 + 7 ;
149158 headers = fillHeaders ( headers , currentSize , true ) ;
150159
160+ console . log ( 'writing' , headers . length ) ;
161+
151162 const server = http . createServer ( common . mustCall ( ( req , res ) => {
152- res . end ( 'hello world ' ) ;
153- setImmediate ( server . close . bind ( server ) ) ;
163+ res . end ( 'hello from test3 server ' ) ;
164+ server . close ( ) ;
154165 } ) ) ;
155166
167+ server . on ( 'clientError' , ( err ) => {
168+ console . log ( err . code ) ;
169+ if ( err . code === 'HPE_HEADER_OVERFLOW' ) {
170+ console . log ( err . rawPacket . toString ( 'hex' ) ) ;
171+ }
172+ } ) ;
173+ server . on ( 'clientError' , common . mustNotCall ( ) ) ;
174+
156175 server . listen ( 0 , common . mustCall ( ( ) => {
157176 const client = net . connect ( server . address ( ) . port ) ;
158177 client . on ( 'connect' , ( ) => {
159178 writeHeaders ( client , headers ) ;
160179 client . resume ( ) ;
161180 } ) ;
181+
182+ client . pipe ( process . stdout ) ;
162183 } ) ) ;
163184} ) ;
164185
0 commit comments