@@ -220,7 +220,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
220
220
if websocket || waitingForPoll || !connected {
221
221
return
222
222
}
223
-
223
+
224
224
waitingForPoll = true
225
225
let req = NSMutableURLRequest ( URL: NSURL ( string: urlPolling! + " &sid= \( sid) &b64=1 " ) !)
226
226
@@ -357,6 +357,40 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
357
357
postWait. removeAll ( keepCapacity: true )
358
358
}
359
359
360
+ private func handleClose( ) {
361
+ if polling {
362
+ client? . engineDidClose ( " Disconnect " )
363
+ }
364
+ }
365
+
366
+ private func checkIfMessageIsBase64 Binary( var message: String) {
367
+ if message. hasPrefix ( " b4 " ) {
368
+ // binary in base64 string
369
+ message. removeRange ( Range < String . Index > ( start: message. startIndex,
370
+ end: advance ( message. startIndex, 2 ) ) )
371
+
372
+ if let data = NSData ( base64EncodedString: message,
373
+ options: NSDataBase64DecodingOptions . IgnoreUnknownCharacters) , client = client {
374
+ dispatch_async ( client. handleQueue) { [ weak self] in
375
+ self ? . client? . parseBinaryData ( data)
376
+ }
377
+ }
378
+ }
379
+ }
380
+
381
+ private func handleMessage( message: String) {
382
+ // Remove message type
383
+ if let client = client {
384
+ dispatch_async ( client. handleQueue) { [ weak client] in
385
+ client? . parseSocketMessage ( message)
386
+ }
387
+ }
388
+ }
389
+
390
+ private func handleNOOP( ) {
391
+ doPoll ( )
392
+ }
393
+
360
394
private func handleOpen( openData: String) {
361
395
var err : NSError ?
362
396
let mesData = openData. dataUsingEncoding ( NSUTF8StringEncoding, allowLossyConversion: false ) !
@@ -387,6 +421,15 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
387
421
}
388
422
}
389
423
424
+ private func handlePong( pongMessage: String) {
425
+ pongsMissed = 0
426
+
427
+ // We should upgrade
428
+ if pongMessage == " 3probe " {
429
+ upgradeTransport ( )
430
+ }
431
+ }
432
+
390
433
// A poll failed, tell the client about it
391
434
private func handlePollingFailed( reason: String) {
392
435
_connected = false
@@ -468,18 +511,15 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
468
511
} else {
469
512
if length == " " || testLength ( length, & n) {
470
513
SocketLogger . err ( " Parsing error: \( str) " , client: self )
471
-
472
514
handlePollingFailed ( " Error parsing XHR message " )
473
515
return
474
516
}
475
517
476
518
msg = String ( strArray [ i+ 1 ... i+ n] )
477
519
478
- if let lengthInt = length. toInt ( ) {
479
- if lengthInt != count ( msg) {
480
- SocketLogger . err ( " parsing error: \( str) " , client: self )
481
- return
482
- }
520
+ if let lengthInt = length. toInt ( ) where lengthInt != count ( msg) {
521
+ SocketLogger . err ( " parsing error: \( str) " , client: self )
522
+ return
483
523
}
484
524
485
525
if count ( msg) != 0 {
@@ -510,45 +550,23 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
510
550
fixDoubleUTF8 ( & message)
511
551
}
512
552
513
- let type = PacketType ( str: ( message [ " ^( \\ d) " ] . groups ( ) ? [ 1 ] ) )
553
+ let type = PacketType ( str: ( message [ " ^( \\ d) " ] . groups ( ) ? [ 1 ] ) ) ?? PacketType . NOOP
514
554
515
- if type == PacketType . MESSAGE {
516
- // Remove message type
555
+ switch type {
556
+ case PacketType . MESSAGE :
517
557
message. removeAtIndex ( message. startIndex)
518
-
519
- if let client = client {
520
- dispatch_async ( client. handleQueue) { [ weak client] in
521
- client? . parseSocketMessage ( message)
522
- }
523
- }
524
- } else if type == PacketType . NOOP {
525
- doPoll ( )
526
- } else if type == PacketType . PONG {
527
- pongsMissed = 0
528
-
529
- // We should upgrade
530
- if message == " 3probe " {
531
- upgradeTransport ( )
532
- }
533
- } else if type == PacketType . OPEN {
558
+ handleMessage ( message)
559
+ case PacketType . NOOP:
560
+ handleNOOP ( )
561
+ case PacketType . PONG:
562
+ handlePong ( message)
563
+ case PacketType . OPEN:
534
564
message. removeAtIndex ( message. startIndex)
535
-
536
565
handleOpen ( message)
537
- } else if type == PacketType . CLOSE {
538
- if polling {
539
- client? . engineDidClose ( " Disconnect " )
540
- }
541
- } else if message. hasPrefix ( " b4 " ) {
542
- // binary in base64 string
543
- message. removeRange ( Range < String . Index > ( start: message. startIndex,
544
- end: advance ( message. startIndex, 2 ) ) )
545
-
546
- if let data = NSData ( base64EncodedString: message,
547
- options: NSDataBase64DecodingOptions . IgnoreUnknownCharacters) , client = client {
548
- dispatch_async ( client. handleQueue) { [ weak self] in
549
- self ? . client? . parseBinaryData ( data)
550
- }
551
- }
566
+ case PacketType . CLOSE:
567
+ handleClose ( )
568
+ default :
569
+ checkIfMessageIsBase64Binary ( message)
552
570
}
553
571
}
554
572
0 commit comments