@@ -220,7 +220,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
220220 if websocket || waitingForPoll || !connected {
221221 return
222222 }
223-
223+
224224 waitingForPoll = true
225225 let req = NSMutableURLRequest ( URL: NSURL ( string: urlPolling! + " &sid= \( sid) &b64=1 " ) !)
226226
@@ -357,6 +357,40 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
357357 postWait. removeAll ( keepCapacity: true )
358358 }
359359
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+
360394 private func handleOpen( openData: String) {
361395 var err : NSError ?
362396 let mesData = openData. dataUsingEncoding ( NSUTF8StringEncoding, allowLossyConversion: false ) !
@@ -387,6 +421,15 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
387421 }
388422 }
389423
424+ private func handlePong( pongMessage: String) {
425+ pongsMissed = 0
426+
427+ // We should upgrade
428+ if pongMessage == " 3probe " {
429+ upgradeTransport ( )
430+ }
431+ }
432+
390433 // A poll failed, tell the client about it
391434 private func handlePollingFailed( reason: String) {
392435 _connected = false
@@ -468,18 +511,15 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
468511 } else {
469512 if length == " " || testLength ( length, & n) {
470513 SocketLogger . err ( " Parsing error: \( str) " , client: self )
471-
472514 handlePollingFailed ( " Error parsing XHR message " )
473515 return
474516 }
475517
476518 msg = String ( strArray [ i+ 1 ... i+ n] )
477519
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
483523 }
484524
485525 if count ( msg) != 0 {
@@ -510,45 +550,23 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
510550 fixDoubleUTF8 ( & message)
511551 }
512552
513- let type = PacketType ( str: ( message [ " ^( \\ d) " ] . groups ( ) ? [ 1 ] ) )
553+ let type = PacketType ( str: ( message [ " ^( \\ d) " ] . groups ( ) ? [ 1 ] ) ) ?? PacketType . NOOP
514554
515- if type == PacketType . MESSAGE {
516- // Remove message type
555+ switch type {
556+ case PacketType . MESSAGE :
517557 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:
534564 message. removeAtIndex ( message. startIndex)
535-
536565 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)
552570 }
553571 }
554572
0 commit comments