@@ -234,24 +234,26 @@ class WebSocketServer extends EventEmitter {
234
234
const version = + req . headers [ 'sec-websocket-version' ] ;
235
235
236
236
if ( req . method !== 'GET' ) {
237
- abortHandshake ( socket , 405 , 'Invalid HTTP method' ) ;
237
+ const message = 'Invalid HTTP method' ;
238
+ abortHandshakeOrEmitwsClientError ( this , req , socket , 405 , message ) ;
238
239
return ;
239
240
}
240
241
241
242
if ( req . headers . upgrade . toLowerCase ( ) !== 'websocket' ) {
242
- abortHandshake ( socket , 400 , 'Invalid Upgrade header' ) ;
243
+ const message = 'Invalid Upgrade header' ;
244
+ abortHandshakeOrEmitwsClientError ( this , req , socket , 400 , message ) ;
243
245
return ;
244
246
}
245
247
246
248
if ( ! key || ! keyRegex . test ( key ) ) {
247
249
const message = 'Missing or invalid Sec-WebSocket-Key header' ;
248
- abortHandshake ( socket , 400 , message ) ;
250
+ abortHandshakeOrEmitwsClientError ( this , req , socket , 400 , message ) ;
249
251
return ;
250
252
}
251
253
252
254
if ( version !== 8 && version !== 13 ) {
253
255
const message = 'Missing or invalid Sec-WebSocket-Version header' ;
254
- abortHandshake ( socket , 400 , message ) ;
256
+ abortHandshakeOrEmitwsClientError ( this , req , socket , 400 , message ) ;
255
257
return ;
256
258
}
257
259
@@ -268,7 +270,7 @@ class WebSocketServer extends EventEmitter {
268
270
protocols = subprotocol . parse ( secWebSocketProtocol ) ;
269
271
} catch ( err ) {
270
272
const message = 'Invalid Sec-WebSocket-Protocol header' ;
271
- abortHandshake ( socket , 400 , message ) ;
273
+ abortHandshakeOrEmitwsClientError ( this , req , socket , 400 , message ) ;
272
274
return ;
273
275
}
274
276
}
@@ -296,7 +298,7 @@ class WebSocketServer extends EventEmitter {
296
298
} catch ( err ) {
297
299
const message =
298
300
'Invalid or unacceptable Sec-WebSocket-Extensions header' ;
299
- abortHandshake ( socket , 400 , message ) ;
301
+ abortHandshakeOrEmitwsClientError ( this , req , socket , 400 , message ) ;
300
302
return ;
301
303
}
302
304
}
@@ -509,3 +511,25 @@ function abortHandshake(socket, code, message, headers) {
509
511
message
510
512
) ;
511
513
}
514
+
515
+ /**
516
+ * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least
517
+ * one listener for it, otherwise call `abortHandshake()`.
518
+ *
519
+ * @param {WebSocketServer } server The WebSocket server
520
+ * @param {http.IncomingMessage } req The request object
521
+ * @param {(net.Socket|tls.Socket) } socket The socket of the upgrade request
522
+ * @param {Number } code The HTTP response status code
523
+ * @param {String } message The HTTP response body
524
+ * @private
525
+ */
526
+ function abortHandshakeOrEmitwsClientError ( server , req , socket , code , message ) {
527
+ if ( server . listenerCount ( 'wsClientError' ) ) {
528
+ const err = new Error ( message ) ;
529
+ Error . captureStackTrace ( err , abortHandshakeOrEmitwsClientError ) ;
530
+
531
+ server . emit ( 'wsClientError' , err , socket , req ) ;
532
+ } else {
533
+ abortHandshake ( socket , code , message ) ;
534
+ }
535
+ }
0 commit comments