@@ -109,37 +109,60 @@ class Server extends EventEmitter {
109
109
const transport = req . _query . transport ;
110
110
if ( ! ~ this . opts . transports . indexOf ( transport ) ) {
111
111
debug ( 'unknown transport "%s"' , transport ) ;
112
- return fn ( Server . errors . UNKNOWN_TRANSPORT , false ) ;
112
+ return fn ( Server . errors . UNKNOWN_TRANSPORT , { transport } ) ;
113
113
}
114
114
115
115
// 'Origin' header check
116
116
const isOriginInvalid = checkInvalidHeaderChar ( req . headers . origin ) ;
117
117
if ( isOriginInvalid ) {
118
+ const origin = req . headers . origin ;
118
119
req . headers . origin = null ;
119
120
debug ( "origin header invalid" ) ;
120
- return fn ( Server . errors . BAD_REQUEST , false ) ;
121
+ return fn ( Server . errors . BAD_REQUEST , {
122
+ name : "INVALID_ORIGIN" ,
123
+ origin
124
+ } ) ;
121
125
}
122
126
123
127
// sid check
124
128
const sid = req . _query . sid ;
125
129
if ( sid ) {
126
130
if ( ! this . clients . hasOwnProperty ( sid ) ) {
127
131
debug ( 'unknown sid "%s"' , sid ) ;
128
- return fn ( Server . errors . UNKNOWN_SID , false ) ;
132
+ return fn ( Server . errors . UNKNOWN_SID , {
133
+ sid
134
+ } ) ;
129
135
}
130
- if ( ! upgrade && this . clients [ sid ] . transport . name !== transport ) {
136
+ const previousTransport = this . clients [ sid ] . transport . name ;
137
+ if ( ! upgrade && previousTransport !== transport ) {
131
138
debug ( "bad request: unexpected transport without upgrade" ) ;
132
- return fn ( Server . errors . BAD_REQUEST , false ) ;
139
+ return fn ( Server . errors . BAD_REQUEST , {
140
+ name : "TRANSPORT_MISMATCH" ,
141
+ transport,
142
+ previousTransport
143
+ } ) ;
133
144
}
134
145
} else {
135
146
// handshake is GET only
136
- if ( "GET" !== req . method )
137
- return fn ( Server . errors . BAD_HANDSHAKE_METHOD , false ) ;
138
- if ( ! this . opts . allowRequest ) return fn ( null , true ) ;
139
- return this . opts . allowRequest ( req , fn ) ;
147
+ if ( "GET" !== req . method ) {
148
+ return fn ( Server . errors . BAD_HANDSHAKE_METHOD , {
149
+ method : req . method
150
+ } ) ;
151
+ }
152
+
153
+ if ( ! this . opts . allowRequest ) return fn ( ) ;
154
+
155
+ return this . opts . allowRequest ( req , ( message , success ) => {
156
+ if ( ! success ) {
157
+ return fn ( Server . errors . FORBIDDEN , {
158
+ message
159
+ } ) ;
160
+ }
161
+ fn ( ) ;
162
+ } ) ;
140
163
}
141
164
142
- fn ( null , true ) ;
165
+ fn ( ) ;
143
166
}
144
167
145
168
/**
@@ -186,9 +209,15 @@ class Server extends EventEmitter {
186
209
this . prepare ( req ) ;
187
210
req . res = res ;
188
211
189
- const callback = ( err , success ) => {
190
- if ( ! success ) {
191
- sendErrorMessage ( req , res , err ) ;
212
+ const callback = ( errorCode , errorContext ) => {
213
+ if ( errorCode !== undefined ) {
214
+ this . emit ( "connection_error" , {
215
+ req,
216
+ code : errorCode ,
217
+ message : Server . errorMessages [ errorCode ] ,
218
+ context : errorContext
219
+ } ) ;
220
+ sendErrorMessage ( req , res , errorCode , errorContext ) ;
192
221
return ;
193
222
}
194
223
@@ -231,6 +260,15 @@ class Server extends EventEmitter {
231
260
const protocol = req . _query . EIO === "4" ? 4 : 3 ; // 3rd revision by default
232
261
if ( protocol === 3 && ! this . opts . allowEIO3 ) {
233
262
debug ( "unsupported protocol version" ) ;
263
+ this . emit ( "connection_error" , {
264
+ req,
265
+ code : Server . errors . UNSUPPORTED_PROTOCOL_VERSION ,
266
+ message :
267
+ Server . errorMessages [ Server . errors . UNSUPPORTED_PROTOCOL_VERSION ] ,
268
+ context : {
269
+ protocol
270
+ }
271
+ } ) ;
234
272
sendErrorMessage (
235
273
req ,
236
274
req . res ,
@@ -244,6 +282,15 @@ class Server extends EventEmitter {
244
282
id = await this . generateId ( req ) ;
245
283
} catch ( e ) {
246
284
debug ( "error while generating an id" ) ;
285
+ this . emit ( "connection_error" , {
286
+ req,
287
+ code : Server . errors . BAD_REQUEST ,
288
+ message : Server . errorMessages [ Server . errors . BAD_REQUEST ] ,
289
+ context : {
290
+ name : "ID_GENERATION_ERROR" ,
291
+ error : e
292
+ }
293
+ } ) ;
247
294
sendErrorMessage ( req , req . res , Server . errors . BAD_REQUEST ) ;
248
295
return ;
249
296
}
@@ -266,6 +313,15 @@ class Server extends EventEmitter {
266
313
}
267
314
} catch ( e ) {
268
315
debug ( 'error handshaking to transport "%s"' , transportName ) ;
316
+ this . emit ( "connection_error" , {
317
+ req,
318
+ code : Server . errors . BAD_REQUEST ,
319
+ message : Server . errorMessages [ Server . errors . BAD_REQUEST ] ,
320
+ context : {
321
+ name : "TRANSPORT_HANDSHAKE_ERROR" ,
322
+ error : e
323
+ }
324
+ } ) ;
269
325
sendErrorMessage ( req , req . res , Server . errors . BAD_REQUEST ) ;
270
326
return ;
271
327
}
@@ -304,9 +360,15 @@ class Server extends EventEmitter {
304
360
this . prepare ( req ) ;
305
361
306
362
const self = this ;
307
- this . verify ( req , true , function ( err , success ) {
308
- if ( ! success ) {
309
- abortConnection ( socket , err ) ;
363
+ this . verify ( req , true , ( errorCode , errorContext ) => {
364
+ if ( errorCode ) {
365
+ this . emit ( "connection_error" , {
366
+ req,
367
+ code : errorCode ,
368
+ message : Server . errorMessages [ errorCode ] ,
369
+ context : errorContext
370
+ } ) ;
371
+ abortConnection ( socket , errorCode , errorContext ) ;
310
372
return ;
311
373
}
312
374
@@ -469,52 +531,46 @@ Server.errorMessages = {
469
531
/**
470
532
* Sends an Engine.IO Error Message
471
533
*
472
- * @param {http.ServerResponse } response
473
- * @param {code } error code
534
+ * @param req - the request object
535
+ * @param res - the response object
536
+ * @param errorCode - the error code
537
+ * @param errorContext - additional error context
538
+ *
474
539
* @api private
475
540
*/
476
541
477
- function sendErrorMessage ( req , res , code ) {
478
- const headers = { "Content-Type" : "application/json" } ;
479
-
480
- const isForbidden = ! Server . errorMessages . hasOwnProperty ( code ) ;
481
- if ( isForbidden ) {
482
- res . writeHead ( 403 , headers ) ;
483
- res . end (
484
- JSON . stringify ( {
485
- code : Server . errors . FORBIDDEN ,
486
- message : code || Server . errorMessages [ Server . errors . FORBIDDEN ]
487
- } )
488
- ) ;
489
- return ;
490
- }
491
- if ( res !== undefined ) {
492
- res . writeHead ( 400 , headers ) ;
493
- res . end (
494
- JSON . stringify ( {
495
- code : code ,
496
- message : Server . errorMessages [ code ]
497
- } )
498
- ) ;
499
- }
542
+ function sendErrorMessage ( req , res , errorCode , errorContext ) {
543
+ const statusCode = errorCode === Server . errors . FORBIDDEN ? 403 : 400 ;
544
+ const message =
545
+ errorContext && errorContext . message
546
+ ? errorContext . message
547
+ : Server . errorMessages [ errorCode ] ;
548
+
549
+ res . writeHead ( statusCode , { "Content-Type" : "application/json" } ) ;
550
+ res . end (
551
+ JSON . stringify ( {
552
+ code : errorCode ,
553
+ message
554
+ } )
555
+ ) ;
500
556
}
501
557
502
558
/**
503
559
* Closes the connection
504
560
*
505
561
* @param {net.Socket } socket
506
- * @param {code } error code
562
+ * @param {string } errorCode - the error code
563
+ * @param {object } errorContext - additional error context
564
+ *
507
565
* @api private
508
566
*/
509
567
510
- function abortConnection ( socket , code ) {
568
+ function abortConnection ( socket , errorCode , errorContext ) {
511
569
socket . on ( "error" , ( ) => {
512
570
debug ( "ignoring error from closed connection" ) ;
513
571
} ) ;
514
572
if ( socket . writable ) {
515
- const message = Server . errorMessages . hasOwnProperty ( code )
516
- ? Server . errorMessages [ code ]
517
- : String ( code || "" ) ;
573
+ const message = errorContext . message || Server . errorMessages [ errorCode ] ;
518
574
const length = Buffer . byteLength ( message ) ;
519
575
socket . write (
520
576
"HTTP/1.1 400 Bad Request\r\n" +
0 commit comments