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