From 27124610445774ed76a596fbabd4f51c55707f80 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 16 Mar 2015 17:58:12 -0400 Subject: [PATCH 1/3] fix #26 --- Socket.IO-Client-Swift.podspec | 4 ++-- SwiftIO/SocketParser.swift | 34 ++++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 67b1fa5..e5877c9 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Socket.IO-Client-Swift" - s.version = "1.2.0" + s.version = "1.2.1" s.summary = "Socket.IO-client for Swift" s.description = <<-DESC Socket.IO-client for Swift. @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.author = { "Erik" => "nuclear.ace@gmail.com" } s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.10' - s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.2.0' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.2.1' } s.source_files = "SwiftIO/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index 9791a5b..bd0e29b 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -211,7 +211,7 @@ class SocketParser { } } - if stringMessage.hasPrefix("5") { + if stringMessage.hasPrefix("5") || stringMessage.hasPrefix("6") { // Check for message with binary placeholders self.parseBinaryMessage(stringMessage, socket: socket) return @@ -220,10 +220,16 @@ class SocketParser { /** Begin check for message **/ - let messageGroups = stringMessage["(\\d*)\\/?(\\w*)?,?(\\d*)?\\[\"(.*?)\",?(.*?)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() - if messageGroups == nil { - NSLog("Error in groups") + 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 } @@ -289,6 +295,12 @@ class SocketParser { // Handles binary data class func parseBinaryData(data:NSData, socket:SocketIOClient) { // NSLog(data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros)) + + if socket.waitingData.count == 0 { + NSLog("Got data when not remaking packet") + return + } + let shouldExecute = socket.waitingData[0].addData(data) if shouldExecute { @@ -339,10 +351,16 @@ class SocketParser { /** Begin check for binary placeholders **/ - let binaryGroup = message["^(\\d*)-\\/?(\\w*)?,?(\\d*)?\\[(\".*?\")?,?(.*)?\\]$", - NSRegularExpressionOptions.DotMatchesLineSeparators].groups() + var binaryGroup:[String]? - if binaryGroup == nil { + 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 + } else { + NSLog("Error in parsing binary message: %s", message) return } From 7d08f962d5156ecbd0d77ebcf4439e223cb5a2fb Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 16 Mar 2015 20:48:09 -0400 Subject: [PATCH 2/3] fix socketio/socket.io-client-swift#16 --- SwiftIO/SocketAckHandler.swift | 6 +++++- SwiftIO/SocketIOClient.swift | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/SwiftIO/SocketAckHandler.swift b/SwiftIO/SocketAckHandler.swift index a5ab0d0..664fc7e 100644 --- a/SwiftIO/SocketAckHandler.swift +++ b/SwiftIO/SocketAckHandler.swift @@ -31,10 +31,13 @@ public typealias AckCallback = (NSArray?) -> Void let event:String! var acked = false var callback:AckCallback? + weak var socket:SocketIOClient? + - init(event:String, ackNum:Int = 0) { + init(event:String, ackNum:Int = 0, socket:SocketIOClient) { self.ackNum = ackNum self.event = event + self.socket = socket } public func onAck(timeout:UInt64, withCallback callback:AckCallback) { @@ -50,6 +53,7 @@ public typealias AckCallback = (NSArray?) -> Void if !self!.acked { self?.executeAck(["No ACK"]) + self?.socket?.removeAck(self!) } } } diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 330ffbf..b9dc716 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -198,11 +198,12 @@ public class SocketIOClient: NSObject { public func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler { if !self.connected { - return SocketAckHandler(event: "fail") + return SocketAckHandler(event: "fail", socket: self) } self.currentAck++ - let ackHandler = SocketAckHandler(event: event, ackNum: self.currentAck) + let ackHandler = SocketAckHandler(event: event, + ackNum: self.currentAck, socket: self) self.ackHandlers.append(ackHandler) dispatch_async(self.emitQueue) {[weak self] in @@ -385,6 +386,10 @@ public class SocketIOClient: NSObject { } } + func removeAck(ack:SocketAckHandler) { + self.ackHandlers = self.ackHandlers.filter {$0 === ack ? false : true} + } + // We lost connection and should attempt to reestablish func tryReconnect() { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { From ac31b4a788ed6d8afda443c450626994ecb4b65a Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 17 Mar 2015 12:12:30 -0400 Subject: [PATCH 3/3] hopefully fix nuclearace/Socket.IO-Client-Swift#27 --- SwiftIO/SocketIOClient.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index b9dc716..27afb7d 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -206,8 +206,8 @@ public class SocketIOClient: NSObject { ackNum: self.currentAck, socket: self) self.ackHandlers.append(ackHandler) - dispatch_async(self.emitQueue) {[weak self] in - self?._emit(event, args, ack: true) + dispatch_async(self.emitQueue) {[weak self, ack = self.currentAck] in + self?._emit(event, args, ack: ack) return } @@ -218,7 +218,7 @@ public class SocketIOClient: NSObject { return self.emitWithAck(event, args) } - private func _emit(event:String, _ args:[AnyObject], ack:Bool = false) { + private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { var frame:SocketEvent var str:String @@ -229,22 +229,22 @@ public class SocketIOClient: NSObject { } if hasBinary { - if !ack { + if ack == nil { str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp) } else { str = SocketEvent.createMessageForEvent(event, withArgs: items, - hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: self.currentAck) + hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: ack) } self.engine?.send(str, datas: emitDatas) } else { - if !ack { + if ack == nil { str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, withDatas: 0, toNamespace: self.nsp) } else { str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, - withDatas: 0, toNamespace: self.nsp, wantsAck: self.currentAck) + withDatas: 0, toNamespace: self.nsp, wantsAck: ack) } self.engine?.send(str)