@@ -44,3 +44,172 @@ test('Open event is emitted', (t) => {
44
44
ws . onmessage = ws . onerror = t . fail
45
45
ws . addEventListener ( 'open' , t . pass )
46
46
} )
47
+
48
+ test ( 'Multiple protocols are joined by a comma' , ( t ) => {
49
+ t . plan ( 1 )
50
+
51
+ const server = new WebSocketServer ( { port : 0 } )
52
+
53
+ server . on ( 'connection' , ( ws , req ) => {
54
+ t . equal ( req . headers [ 'sec-websocket-protocol' ] , 'chat, echo' )
55
+
56
+ ws . close ( 1000 )
57
+ server . close ( )
58
+ } )
59
+
60
+ t . teardown ( server . close . bind ( server ) )
61
+
62
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` , [ 'chat' , 'echo' ] )
63
+
64
+ ws . addEventListener ( 'open' , ( ) => ws . close ( ) )
65
+ } )
66
+
67
+ test ( 'Server doesn\'t send Sec-WebSocket-Protocol header when protocols are used' , ( t ) => {
68
+ t . plan ( 1 )
69
+
70
+ const server = createServer ( ( req , res ) => {
71
+ res . statusCode = 101
72
+
73
+ req . socket . destroy ( )
74
+ } ) . listen ( 0 , ( ) => {
75
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` , 'chat' )
76
+
77
+ ws . onopen = t . fail
78
+
79
+ ws . addEventListener ( 'error' , ( { error } ) => {
80
+ t . ok ( error )
81
+ } )
82
+ } )
83
+
84
+ t . teardown ( server . close . bind ( server ) )
85
+ } )
86
+
87
+ test ( 'Server sends invalid Upgrade header' , ( t ) => {
88
+ t . plan ( 1 )
89
+
90
+ const server = createServer ( ( req , res ) => {
91
+ res . setHeader ( 'Upgrade' , 'NotWebSocket' )
92
+ res . statusCode = 101
93
+
94
+ req . socket . destroy ( )
95
+ } ) . listen ( 0 , ( ) => {
96
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` )
97
+
98
+ ws . onopen = t . fail
99
+
100
+ ws . addEventListener ( 'error' , ( { error } ) => {
101
+ t . ok ( error )
102
+ } )
103
+ } )
104
+
105
+ t . teardown ( server . close . bind ( server ) )
106
+ } )
107
+
108
+ test ( 'Server sends invalid Connection header' , ( t ) => {
109
+ t . plan ( 1 )
110
+
111
+ const server = createServer ( ( req , res ) => {
112
+ res . setHeader ( 'Upgrade' , 'websocket' )
113
+ res . setHeader ( 'Connection' , 'downgrade' )
114
+ res . statusCode = 101
115
+
116
+ req . socket . destroy ( )
117
+ } ) . listen ( 0 , ( ) => {
118
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` )
119
+
120
+ ws . onopen = t . fail
121
+
122
+ ws . addEventListener ( 'error' , ( { error } ) => {
123
+ t . ok ( error )
124
+ } )
125
+ } )
126
+
127
+ t . teardown ( server . close . bind ( server ) )
128
+ } )
129
+
130
+ test ( 'Server sends invalid Sec-WebSocket-Accept header' , ( t ) => {
131
+ t . plan ( 1 )
132
+
133
+ const server = createServer ( ( req , res ) => {
134
+ res . setHeader ( 'Upgrade' , 'websocket' )
135
+ res . setHeader ( 'Connection' , 'upgrade' )
136
+ res . setHeader ( 'Sec-WebSocket-Accept' , 'abc' )
137
+ res . statusCode = 101
138
+
139
+ req . socket . destroy ( )
140
+ } ) . listen ( 0 , ( ) => {
141
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` )
142
+
143
+ ws . onopen = t . fail
144
+
145
+ ws . addEventListener ( 'error' , ( { error } ) => {
146
+ t . ok ( error )
147
+ } )
148
+ } )
149
+
150
+ t . teardown ( server . close . bind ( server ) )
151
+ } )
152
+
153
+ test ( 'Server sends invalid Sec-WebSocket-Extensions header' , ( t ) => {
154
+ const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
155
+ const { createHash } = require ( 'crypto' )
156
+
157
+ t . plan ( 2 )
158
+
159
+ const server = createServer ( ( req , res ) => {
160
+ const key = req . headers [ 'sec-websocket-key' ]
161
+ t . ok ( key )
162
+
163
+ const accept = createHash ( 'sha1' ) . update ( key + uid ) . digest ( 'base64' )
164
+
165
+ res . setHeader ( 'Upgrade' , 'websocket' )
166
+ res . setHeader ( 'Connection' , 'upgrade' )
167
+ res . setHeader ( 'Sec-WebSocket-Accept' , accept )
168
+ res . setHeader ( 'Sec-WebSocket-Extensions' , 'InvalidExtension' )
169
+ res . statusCode = 101
170
+
171
+ res . end ( )
172
+ } ) . listen ( 0 , ( ) => {
173
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` )
174
+
175
+ ws . onopen = t . fail
176
+
177
+ ws . addEventListener ( 'error' , ( { error } ) => {
178
+ t . ok ( error )
179
+ } )
180
+ } )
181
+
182
+ t . teardown ( server . close . bind ( server ) )
183
+ } )
184
+
185
+ test ( 'Server sends invalid Sec-WebSocket-Extensions header' , ( t ) => {
186
+ const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
187
+ const { createHash } = require ( 'crypto' )
188
+
189
+ t . plan ( 2 )
190
+
191
+ const server = createServer ( ( req , res ) => {
192
+ const key = req . headers [ 'sec-websocket-key' ]
193
+ t . ok ( key )
194
+
195
+ const accept = createHash ( 'sha1' ) . update ( key + uid ) . digest ( 'base64' )
196
+
197
+ res . setHeader ( 'Upgrade' , 'websocket' )
198
+ res . setHeader ( 'Connection' , 'upgrade' )
199
+ res . setHeader ( 'Sec-WebSocket-Accept' , accept )
200
+ res . setHeader ( 'Sec-WebSocket-Protocol' , 'echo' ) // <--
201
+ res . statusCode = 101
202
+
203
+ res . end ( )
204
+ } ) . listen ( 0 , ( ) => {
205
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` , 'chat' )
206
+
207
+ ws . onopen = t . fail
208
+
209
+ ws . addEventListener ( 'error' , ( { error } ) => {
210
+ t . ok ( error )
211
+ } )
212
+ } )
213
+
214
+ t . teardown ( server . close . bind ( server ) )
215
+ } )
0 commit comments