@@ -8,110 +8,131 @@ const h2 = require('http2');
88
99const server = h2 . createServer ( ) ;
1010
11- server . on ( 'stream' , common . mustCall ( onStream ) ) ;
12-
13- function assertSettings ( settings ) {
14- assert . strictEqual ( typeof settings , 'object' ) ;
15- assert . strictEqual ( typeof settings . headerTableSize , 'number' ) ;
16- assert . strictEqual ( typeof settings . enablePush , 'boolean' ) ;
17- assert . strictEqual ( typeof settings . initialWindowSize , 'number' ) ;
18- assert . strictEqual ( typeof settings . maxFrameSize , 'number' ) ;
19- assert . strictEqual ( typeof settings . maxConcurrentStreams , 'number' ) ;
20- assert . strictEqual ( typeof settings . maxHeaderListSize , 'number' ) ;
21- }
22-
23- function onStream ( stream , headers , flags ) {
24-
25- const localSettings = stream . session . localSettings ;
26- const remoteSettings = stream . session . remoteSettings ;
27- assertSettings ( localSettings ) ;
28- assertSettings ( remoteSettings ) ;
29-
30- // Test that stored settings are returned when called for second time
31- assert . strictEqual ( stream . session . localSettings , localSettings ) ;
32- assert . strictEqual ( stream . session . remoteSettings , remoteSettings ) ;
33-
34- stream . respond ( {
35- 'content-type' : 'text/html' ,
36- ':status' : 200
37- } ) ;
38- stream . end ( 'hello world' ) ;
39- }
40-
41- server . listen ( 0 ) ;
42-
43- server . on ( 'listening' , common . mustCall ( ( ) => {
44-
45- const client = h2 . connect ( `http://localhost:${ server . address ( ) . port } ` , {
46- settings : {
47- enablePush : false ,
48- initialWindowSize : 123456
49- }
50- } ) ;
51-
52- client . on ( 'localSettings' , common . mustCall ( ( settings ) => {
53- assert ( settings ) ;
54- assert . strictEqual ( settings . enablePush , false ) ;
55- assert . strictEqual ( settings . initialWindowSize , 123456 ) ;
56- assert . strictEqual ( settings . maxFrameSize , 16384 ) ;
57- } , 2 ) ) ;
58- client . on ( 'remoteSettings' , common . mustCall ( ( settings ) => {
59- assert ( settings ) ;
60- } ) ) ;
61-
62- const headers = { ':path' : '/' } ;
63-
64- const req = client . request ( headers ) ;
65-
66- req . on ( 'connect' , common . mustCall ( ( ) => {
67- // pendingSettingsAck will be true if a SETTINGS frame
68- // has been sent but we are still waiting for an acknowledgement
69- assert ( client . pendingSettingsAck ) ;
70- } ) ) ;
71-
72- // State will only be valid after connect event is emitted
73- req . on ( 'ready' , common . mustCall ( ( ) => {
74- assert . doesNotThrow ( ( ) => {
75- client . settings ( {
76- maxHeaderListSize : 1
77- } ) ;
11+ server . on (
12+ 'stream' ,
13+ common . mustCall ( ( stream ) => {
14+ const assertSettings = ( settings ) => {
15+ assert . strictEqual ( typeof settings , 'object' ) ;
16+ assert . strictEqual ( typeof settings . headerTableSize , 'number' ) ;
17+ assert . strictEqual ( typeof settings . enablePush , 'boolean' ) ;
18+ assert . strictEqual ( typeof settings . initialWindowSize , 'number' ) ;
19+ assert . strictEqual ( typeof settings . maxFrameSize , 'number' ) ;
20+ assert . strictEqual ( typeof settings . maxConcurrentStreams , 'number' ) ;
21+ assert . strictEqual ( typeof settings . maxHeaderListSize , 'number' ) ;
22+ } ;
23+
24+ const localSettings = stream . session . localSettings ;
25+ const remoteSettings = stream . session . remoteSettings ;
26+ assertSettings ( localSettings ) ;
27+ assertSettings ( remoteSettings ) ;
28+
29+ // Test that stored settings are returned when called for second time
30+ assert . strictEqual ( stream . session . localSettings , localSettings ) ;
31+ assert . strictEqual ( stream . session . remoteSettings , remoteSettings ) ;
32+
33+ stream . respond ( {
34+ 'content-type' : 'text/html' ,
35+ ':status' : 200
7836 } ) ;
79-
80- // Verify valid error ranges
81- [
82- [ 'headerTableSize' , - 1 ] ,
83- [ 'headerTableSize' , 2 ** 32 ] ,
84- [ 'initialWindowSize' , - 1 ] ,
85- [ 'initialWindowSize' , 2 ** 32 ] ,
86- [ 'maxFrameSize' , 16383 ] ,
87- [ 'maxFrameSize' , 2 ** 24 ] ,
88- [ 'maxHeaderListSize' , - 1 ] ,
89- [ 'maxHeaderListSize' , 2 ** 32 ]
90- ] . forEach ( ( i ) => {
91- const settings = { } ;
92- settings [ i [ 0 ] ] = i [ 1 ] ;
93- assert . throws ( ( ) => client . settings ( settings ) ,
94- common . expectsError ( {
95- code : 'ERR_HTTP2_INVALID_SETTING_VALUE' ,
96- type : RangeError
97- } ) ) ;
98- } ) ;
99- [ 1 , { } , 'test' , [ ] , null , Infinity , NaN ] . forEach ( ( i ) => {
100- assert . throws ( ( ) => client . settings ( { enablePush : i } ) ,
101- common . expectsError ( {
102- code : 'ERR_HTTP2_INVALID_SETTING_VALUE' ,
103- type : TypeError
104- } ) ) ;
37+ stream . end ( 'hello world' ) ;
38+ } )
39+ ) ;
40+
41+ server . listen (
42+ 0 ,
43+ common . mustCall ( ( ) => {
44+ const client = h2 . connect ( `http://localhost:${ server . address ( ) . port } ` , {
45+ settings : {
46+ enablePush : false ,
47+ initialWindowSize : 123456
48+ }
10549 } ) ;
10650
107- } ) ) ;
108-
109- req . on ( 'response' , common . mustCall ( ) ) ;
110- req . resume ( ) ;
111- req . on ( 'end' , common . mustCall ( ( ) => {
112- server . close ( ) ;
113- client . destroy ( ) ;
114- } ) ) ;
115- req . end ( ) ;
116-
117- } ) ) ;
51+ client . on (
52+ 'localSettings' ,
53+ common . mustCall ( ( settings ) => {
54+ assert ( settings ) ;
55+ assert . strictEqual ( settings . enablePush , false ) ;
56+ assert . strictEqual ( settings . initialWindowSize , 123456 ) ;
57+ assert . strictEqual ( settings . maxFrameSize , 16384 ) ;
58+ } , 2 )
59+ ) ;
60+ client . on (
61+ 'remoteSettings' ,
62+ common . mustCall ( ( settings ) => {
63+ assert ( settings ) ;
64+ } )
65+ ) ;
66+
67+ const headers = { ':path' : '/' } ;
68+
69+ const req = client . request ( headers ) ;
70+
71+ req . on (
72+ 'connect' ,
73+ common . mustCall ( ( ) => {
74+ // pendingSettingsAck will be true if a SETTINGS frame
75+ // has been sent but we are still waiting for an acknowledgement
76+ assert ( client . pendingSettingsAck ) ;
77+ } )
78+ ) ;
79+
80+ // State will only be valid after connect event is emitted
81+ req . on (
82+ 'ready' ,
83+ common . mustCall ( ( ) => {
84+ assert . doesNotThrow ( ( ) => {
85+ client . settings ( {
86+ maxHeaderListSize : 1
87+ } ) ;
88+ } ) ;
89+
90+ // Verify valid error ranges
91+ [
92+ [ 'headerTableSize' , - 1 ] ,
93+ [ 'headerTableSize' , 2 ** 32 ] ,
94+ [ 'initialWindowSize' , - 1 ] ,
95+ [ 'initialWindowSize' , 2 ** 32 ] ,
96+ [ 'maxFrameSize' , 16383 ] ,
97+ [ 'maxFrameSize' , 2 ** 24 ] ,
98+ [ 'maxHeaderListSize' , - 1 ] ,
99+ [ 'maxHeaderListSize' , 2 ** 32 ]
100+ ] . forEach ( ( i ) => {
101+ const settings = { } ;
102+ settings [ i [ 0 ] ] = i [ 1 ] ;
103+ common . expectsError (
104+ ( ) => client . settings ( settings ) ,
105+ {
106+ type : RangeError ,
107+ code : 'ERR_HTTP2_INVALID_SETTING_VALUE' ,
108+ message : `Invalid value for setting "${ i [ 0 ] } ": ${ i [ 1 ] } `
109+ }
110+ ) ;
111+ } ) ;
112+
113+ // error checks for enablePush
114+ [ 1 , { } , 'test' , [ ] , null , Infinity , NaN ] . forEach ( ( i ) => {
115+ common . expectsError (
116+ ( ) => client . settings ( { enablePush : i } ) ,
117+ {
118+ type : TypeError ,
119+ code : 'ERR_HTTP2_INVALID_SETTING_VALUE' ,
120+ message : `Invalid value for setting "enablePush": ${ i } `
121+ }
122+ ) ;
123+ } ) ;
124+ } )
125+ ) ;
126+
127+ req . on ( 'response' , common . mustCall ( ) ) ;
128+ req . resume ( ) ;
129+ req . on (
130+ 'end' ,
131+ common . mustCall ( ( ) => {
132+ server . close ( ) ;
133+ client . destroy ( ) ;
134+ } )
135+ ) ;
136+ req . end ( ) ;
137+ } )
138+ ) ;
0 commit comments