@@ -13,6 +13,7 @@ import (
13
13
"testing"
14
14
15
15
"nhooyr.io/websocket/internal/test/assert"
16
+ "nhooyr.io/websocket/internal/test/xrand"
16
17
)
17
18
18
19
func TestAccept (t * testing.T ) {
@@ -36,7 +37,7 @@ func TestAccept(t *testing.T) {
36
37
r .Header .Set ("Connection" , "Upgrade" )
37
38
r .Header .Set ("Upgrade" , "websocket" )
38
39
r .Header .Set ("Sec-WebSocket-Version" , "13" )
39
- r .Header .Set ("Sec-WebSocket-Key" , "meow123" )
40
+ r .Header .Set ("Sec-WebSocket-Key" , xrand . Base64 ( 16 ) )
40
41
r .Header .Set ("Origin" , "harhar.com" )
41
42
42
43
_ , err := Accept (w , r , nil )
@@ -52,7 +53,7 @@ func TestAccept(t *testing.T) {
52
53
r .Header .Set ("Connection" , "Upgrade" )
53
54
r .Header .Set ("Upgrade" , "websocket" )
54
55
r .Header .Set ("Sec-WebSocket-Version" , "13" )
55
- r .Header .Set ("Sec-WebSocket-Key" , "meow123" )
56
+ r .Header .Set ("Sec-WebSocket-Key" , xrand . Base64 ( 16 ) )
56
57
r .Header .Set ("Origin" , "https://harhar.com" )
57
58
58
59
_ , err := Accept (w , r , nil )
@@ -67,7 +68,7 @@ func TestAccept(t *testing.T) {
67
68
r .Header .Set ("Connection" , "Upgrade" )
68
69
r .Header .Set ("Upgrade" , "websocket" )
69
70
r .Header .Set ("Sec-WebSocket-Version" , "13" )
70
- r .Header .Set ("Sec-WebSocket-Key" , "meow123" )
71
+ r .Header .Set ("Sec-WebSocket-Key" , xrand . Base64 ( 16 ) )
71
72
r .Header .Set ("Sec-WebSocket-Extensions" , extensions )
72
73
return r
73
74
}
@@ -116,7 +117,7 @@ func TestAccept(t *testing.T) {
116
117
r .Header .Set ("Connection" , "Upgrade" )
117
118
r .Header .Set ("Upgrade" , "websocket" )
118
119
r .Header .Set ("Sec-WebSocket-Version" , "13" )
119
- r .Header .Set ("Sec-WebSocket-Key" , "meow123" )
120
+ r .Header .Set ("Sec-WebSocket-Key" , xrand . Base64 ( 16 ) )
120
121
121
122
_ , err := Accept (w , r , nil )
122
123
assert .Contains (t , err , `http.ResponseWriter does not implement http.Hijacker` )
@@ -136,7 +137,7 @@ func TestAccept(t *testing.T) {
136
137
r .Header .Set ("Connection" , "Upgrade" )
137
138
r .Header .Set ("Upgrade" , "websocket" )
138
139
r .Header .Set ("Sec-WebSocket-Version" , "13" )
139
- r .Header .Set ("Sec-WebSocket-Key" , "meow123" )
140
+ r .Header .Set ("Sec-WebSocket-Key" , xrand . Base64 ( 16 ) )
140
141
141
142
_ , err := Accept (w , r , nil )
142
143
assert .Contains (t , err , `failed to hijack connection` )
@@ -183,21 +184,59 @@ func Test_verifyClientHandshake(t *testing.T) {
183
184
},
184
185
},
185
186
{
186
- name : "badWebSocketKey" ,
187
+ name : "missingWebSocketKey" ,
188
+ h : map [string ]string {
189
+ "Connection" : "Upgrade" ,
190
+ "Upgrade" : "websocket" ,
191
+ "Sec-WebSocket-Version" : "13" ,
192
+ },
193
+ },
194
+ {
195
+ name : "emptyWebSocketKey" ,
187
196
h : map [string ]string {
188
197
"Connection" : "Upgrade" ,
189
198
"Upgrade" : "websocket" ,
190
199
"Sec-WebSocket-Version" : "13" ,
191
200
"Sec-WebSocket-Key" : "" ,
192
201
},
193
202
},
203
+ {
204
+ name : "shortWebSocketKey" ,
205
+ h : map [string ]string {
206
+ "Connection" : "Upgrade" ,
207
+ "Upgrade" : "websocket" ,
208
+ "Sec-WebSocket-Version" : "13" ,
209
+ "Sec-WebSocket-Key" : xrand .Base64 (15 ),
210
+ },
211
+ },
212
+ {
213
+ name : "invalidWebSocketKey" ,
214
+ h : map [string ]string {
215
+ "Connection" : "Upgrade" ,
216
+ "Upgrade" : "websocket" ,
217
+ "Sec-WebSocket-Version" : "13" ,
218
+ "Sec-WebSocket-Key" : "notbase64" ,
219
+ },
220
+ },
221
+ {
222
+ name : "extraWebSocketKey" ,
223
+ h : map [string ]string {
224
+ "Connection" : "Upgrade" ,
225
+ "Upgrade" : "websocket" ,
226
+ "Sec-WebSocket-Version" : "13" ,
227
+ // Kinda cheeky, but http headers are case-insensitive.
228
+ // If 2 sec keys are present, this is a failure condition.
229
+ "Sec-WebSocket-Key" : xrand .Base64 (16 ),
230
+ "sec-webSocket-key" : xrand .Base64 (16 ),
231
+ },
232
+ },
194
233
{
195
234
name : "badHTTPVersion" ,
196
235
h : map [string ]string {
197
236
"Connection" : "Upgrade" ,
198
237
"Upgrade" : "websocket" ,
199
238
"Sec-WebSocket-Version" : "13" ,
200
- "Sec-WebSocket-Key" : "meow123" ,
239
+ "Sec-WebSocket-Key" : xrand . Base64 ( 16 ) ,
201
240
},
202
241
http1 : true ,
203
242
},
@@ -207,7 +246,17 @@ func Test_verifyClientHandshake(t *testing.T) {
207
246
"Connection" : "keep-alive, Upgrade" ,
208
247
"Upgrade" : "websocket" ,
209
248
"Sec-WebSocket-Version" : "13" ,
210
- "Sec-WebSocket-Key" : "meow123" ,
249
+ "Sec-WebSocket-Key" : xrand .Base64 (16 ),
250
+ },
251
+ success : true ,
252
+ },
253
+ {
254
+ name : "successSecKeyExtraSpace" ,
255
+ h : map [string ]string {
256
+ "Connection" : "keep-alive, Upgrade" ,
257
+ "Upgrade" : "websocket" ,
258
+ "Sec-WebSocket-Version" : "13" ,
259
+ "Sec-WebSocket-Key" : " " + xrand .Base64 (16 ) + " " ,
211
260
},
212
261
success : true ,
213
262
},
@@ -227,7 +276,7 @@ func Test_verifyClientHandshake(t *testing.T) {
227
276
}
228
277
229
278
for k , v := range tc .h {
230
- r .Header .Set (k , v )
279
+ r .Header .Add (k , v )
231
280
}
232
281
233
282
_ , err := verifyClientRequest (httptest .NewRecorder (), r )
0 commit comments