From d13d185011facd7520dfd4f6ea879391c4dffaa9 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 18 Mar 2015 19:21:04 -0400 Subject: [PATCH 1/3] work on parser --- SwiftIO/SocketParser.swift | 128 +++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 62 deletions(-) diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index 4e62814..dc02fd4 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -185,7 +185,7 @@ class SocketParser { } // Parses messages recieved - class func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { + class func parseSocketMessage(var stringMessage:String, socket:SocketIOClient) { if stringMessage == "" { return } @@ -225,70 +225,74 @@ class SocketParser { **/ var messageGroups:[String]? - if let groups = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - messageGroups = groups - } else if let ackGroup = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - messageGroups = ackGroup - } else { - NSLog("Error parsing message: %s", stringMessage) - return - } + let type = stringMessage.removeAtIndex(stringMessage.startIndex) - if messageGroups![1].hasPrefix("2") { - var mesNum = messageGroups![1] - var ackNum:String - var namespace:String? - - if messageGroups![3] != "" { - ackNum = messageGroups![3] - } else { - let range = Range(start: mesNum.startIndex, - end: advance(mesNum.startIndex, 1)) - mesNum.replaceRange(range, with: "") - ackNum = mesNum + if type == "2" { + if let groups = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", + NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { + messageGroups = groups + + var mesNum = messageGroups![1] + var ackNum:String + var namespace:String? + + if mesNum == "" { + ackNum = "" + } else if messageGroups![3] != "" { + ackNum = messageGroups![3] + } else { + let range = Range(start: mesNum.startIndex, + end: advance(mesNum.startIndex, 1)) + mesNum.replaceRange(range, with: "") + ackNum = mesNum + } + + namespace = messageGroups![2] + + if namespace == "" && socket.nsp != nil { + return + } + + let event = messageGroups![4] + let data = "[\(messageGroups![5])]" + + if let parsed:AnyObject = self.parseData(data) { + if ackNum == "" { + socket.handleEvent(event, data: parsed) + } else { + socket.currentAck = ackNum.toInt()! + socket.handleEvent(event, data: parsed, isInternalMessage: false, + wantsAck: ackNum.toInt(), withAckType: 3) + } + + return + } + } - - namespace = messageGroups![2] - - if namespace == "" && socket.nsp != nil { - return + } else if type == "3" { + if let ackGroup = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", + NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { + messageGroups = ackGroup + + let arr = Array(messageGroups![1]) + var ackNum:String + let nsp = messageGroups![2] + + if nsp == "" && socket.nsp != nil { + return + } + + if nsp == "" { + ackNum = String(arr[0...arr.count-1]) + } else { + ackNum = messageGroups![3] + } + + let ackData:AnyObject? = self.parseData("[\(messageGroups![4])]") + socket.handleAck(ackNum.toInt()!, data: ackData) + + return } - - let event = messageGroups![4] - let data = "[\(messageGroups![5])]" - - if let parsed:AnyObject = self.parseData(data) { - if ackNum == "" { - socket.handleEvent(event, data: parsed) - } else { - socket.currentAck = ackNum.toInt()! - socket.handleEvent(event, data: parsed, isInternalMessage: false, - wantsAck: ackNum.toInt(), withAckType: 3) - } - - return - } - } else if messageGroups![1].hasPrefix("3") { - let arr = Array(messageGroups![1]) - var ackNum:String - let nsp = messageGroups![2] - - if nsp == "" && socket.nsp != nil { - return - } - - if nsp == "" { - ackNum = String(arr[1...arr.count-1]) - } else { - ackNum = messageGroups![3] - } - - let ackData:AnyObject? = self.parseData(messageGroups![4]) - socket.handleAck(ackNum.toInt()!, data: ackData) - - return } /** End Check for message From 911cac9c23460f5d3bbc392f07579ad97d497212 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 18 Mar 2015 19:54:51 -0400 Subject: [PATCH 2/3] work on parser --- SwiftIO/SocketParser.swift | 171 +++++++++++++++++-------------------- 1 file changed, 78 insertions(+), 93 deletions(-) diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index dc02fd4..e6d2a31 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -220,9 +220,6 @@ class SocketParser { return } - /** - Begin check for message - **/ var messageGroups:[String]? let type = stringMessage.removeAtIndex(stringMessage.startIndex) @@ -231,7 +228,7 @@ class SocketParser { if let groups = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { messageGroups = groups - + var mesNum = messageGroups![1] var ackNum:String var namespace:String? @@ -264,10 +261,7 @@ class SocketParser { socket.handleEvent(event, data: parsed, isInternalMessage: false, wantsAck: ackNum.toInt(), withAckType: 3) } - - return } - } } else if type == "3" { if let ackGroup = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", @@ -290,13 +284,11 @@ class SocketParser { let ackData:AnyObject? = self.parseData("[\(messageGroups![4])]") socket.handleAck(ackNum.toInt()!, data: ackData) - - return } + } else { + NSLog("Error in parsing message: %s", stringMessage) + return } - /** - End Check for message - **/ } // Handles binary data @@ -352,94 +344,87 @@ class SocketParser { } // Tries to parse a message that contains binary - class func parseBinaryMessage(message:String, socket:SocketIOClient) { + class func parseBinaryMessage(var message:String, socket:SocketIOClient) { // NSLog(message) - /** - Begin check for binary placeholders - **/ var binaryGroup:[String]? - if let groups = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(\".*?\")?,?(.*)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - binaryGroup = groups - } else if let groups = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { - binaryGroup = groups + let type = message.removeAtIndex(message.startIndex) + + if type == "5" { + if let groups = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(\".*?\")?,?(.*)?\\]$", + NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { + binaryGroup = groups + + var ackNum:String + var event:String + var mutMessageObject:String + var namespace:String? + let numberOfPlaceholders = binaryGroup![1] + + namespace = binaryGroup![2] + if binaryGroup![3] != "" { + ackNum = binaryGroup![3] as String + } else if socket.nsp == nil && binaryGroup![2] != "" { + ackNum = binaryGroup![2] + } else { + ackNum = "" + } + + event = (binaryGroup![4]["\""] ~= "") as String + mutMessageObject = binaryGroup![5] + + if namespace == "" && socket.nsp != nil { + return + } + + let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] + ~= "\"~~$2\"" + + var mes:SocketEvent + if ackNum == "" { + mes = SocketEvent(event: event, args: placeholdersRemoved, + placeholders: numberOfPlaceholders.toInt()!) + } else { + socket.currentAck = ackNum.toInt()! + mes = SocketEvent(event: event, args: placeholdersRemoved, + placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt()) + } + + socket.waitingData.append(mes) + } + } else if type == "6" { + if let groups = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(.*?)?\\]$", + NSRegularExpressionOptions.DotMatchesLineSeparators].groups() { + binaryGroup = groups + + let numberOfPlaceholders = binaryGroup![1] + var ackNum:String + var nsp:String + + if binaryGroup![3] == "" { + ackNum = binaryGroup![2] + nsp = "" + } else { + ackNum = binaryGroup![3] + nsp = binaryGroup![2] + } + + if nsp == "" && socket.nsp != nil { + return + } + var mutMessageObject = binaryGroup![5] + let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] + ~= "\"~~$2\"" + + let event = SocketEvent(event: "", args: placeholdersRemoved, + placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true) + + socket.waitingData.append(event) + } } else { NSLog("Error in parsing binary message: %s", message) return } - - if binaryGroup![1].hasPrefix("5") { - // println(binaryGroup) - var ackNum:String - var event:String - var mutMessageObject:String - var namespace:String? - var numberOfPlaceholders:String - - let messageType = binaryGroup![1] - - namespace = binaryGroup![2] - if binaryGroup![3] != "" { - ackNum = binaryGroup![3] as String - } else if socket.nsp == nil && binaryGroup![2] != "" { - ackNum = binaryGroup![2] - } else { - ackNum = "" - } - - numberOfPlaceholders = (messageType["5"] ~= "") as String - event = (binaryGroup![4]["\""] ~= "") as String - mutMessageObject = binaryGroup![5] - - if namespace == "" && socket.nsp != nil { - return - } - - let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] - ~= "\"~~$2\"" - - var mes:SocketEvent - if ackNum == "" { - mes = SocketEvent(event: event, args: placeholdersRemoved, - placeholders: numberOfPlaceholders.toInt()!) - } else { - socket.currentAck = ackNum.toInt()! - mes = SocketEvent(event: event, args: placeholdersRemoved, - placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt()) - } - - socket.waitingData.append(mes) - } else if binaryGroup![1].hasPrefix("6") { - let messageType = binaryGroup![1] - let numberOfPlaceholders = (messageType["6"] ~= "") as String - var ackNum:String - var nsp:String - - if binaryGroup![3] == "" { - ackNum = binaryGroup![2] - nsp = "" - } else { - ackNum = binaryGroup![3] - nsp = binaryGroup![2] - } - - if nsp == "" && socket.nsp != nil { - return - } - var mutMessageObject = binaryGroup![5] - let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] - ~= "\"~~$2\"" - - let event = SocketEvent(event: "", args: placeholdersRemoved, - placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true) - - socket.waitingData.append(event) - } - /** - End check for binary placeholders - **/ } } From fd3dbee71c18dc6c896de0b5fe4054c03ff16282 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 19 Mar 2015 08:23:43 -0400 Subject: [PATCH 3/3] fixes --- SwiftIO/SocketEngine.swift | 7 ++++++- SwiftIO/SocketParser.swift | 3 +-- SwiftIO/SwiftRegex.swift | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 3b6428e..9bcb27e 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -409,7 +409,10 @@ public class SocketEngine: NSObject, WebSocketDelegate { } private func parseEngineData(data:NSData) { - self.client.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) + dispatch_async(self.client.handleQueue) {[weak self] in + self?.client.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) + return + } } private func parseEngineMessage(var message:String) { @@ -447,6 +450,8 @@ public class SocketEngine: NSObject, WebSocketDelegate { } else if type == PacketType.NOOP.rawValue { self.doPoll() return + } else if type == PacketType.PONG.rawValue { + return } if message == PacketType.CLOSE.rawValue { diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index e6d2a31..b7346f5 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -346,7 +346,6 @@ class SocketParser { // Tries to parse a message that contains binary class func parseBinaryMessage(var message:String, socket:SocketIOClient) { // NSLog(message) - var binaryGroup:[String]? let type = message.removeAtIndex(message.startIndex) @@ -413,7 +412,7 @@ class SocketParser { if nsp == "" && socket.nsp != nil { return } - var mutMessageObject = binaryGroup![5] + var mutMessageObject = binaryGroup![4] let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" diff --git a/SwiftIO/SwiftRegex.swift b/SwiftIO/SwiftRegex.swift index 19ac4bf..49f9524 100644 --- a/SwiftIO/SwiftRegex.swift +++ b/SwiftIO/SwiftRegex.swift @@ -43,7 +43,7 @@ public class SwiftRegex: NSObject, BooleanType { } final var targetRange: NSRange { - return NSRange(location: 0,length: target.utf16Count) + return NSRange(location: 0,length: countElements(target.utf16)) } final func substring(range: NSRange) -> String? {