diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index c018c1b..a306661 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -76,15 +76,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate { self.forcePolling = forcePolling } - func close(forced:Bool = false) { + func close() { self.pingTimer?.invalidate() - - if !forced { - self.send(PacketType.CLOSE.rawValue) - self.ws?.close() - } else { - self.client.didForceClose() - } + self.send(PacketType.CLOSE.rawValue) } private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { @@ -250,31 +244,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { self.pingTimer?.invalidate() self.wait = false - let forced = {() -> Bool in - var err:NSError? - let url = NSURL(string: self.urlPolling! + "&sid=\(self.sid)")! - let req = NSURLRequest(URL: url, cachePolicy: - NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 4) - var resp:NSURLResponse? - let data = NSURLConnection.sendSynchronousRequest(req, returningResponse: &resp, error: &err) - - if data == nil || resp == nil || err != nil { - return false - } else if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) { - if str == "1:61:1" { - return true - } else { - return false - } - } else { - return false - }}() - - if forced { - self.close(forced: true) - } else { - self.client.pollingDidFail() - } + self.client.pollingDidFail() } } @@ -361,6 +331,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { if let data = NSData(base64EncodedString: messageString, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { + // println("sending \(data)") self?.client.parseSocketMessage(data) } @@ -368,7 +339,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate { } if messageString == PacketType.CLOSE.rawValue { - self?.close(forced: true) + // do nothing return } // println("Got something idk what to do with") @@ -377,6 +348,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate { // Remove message type messageString.removeAtIndex(messageString.startIndex) + // println("sending \(messageString)") + self?.client.parseSocketMessage(messageString) } } @@ -553,11 +526,13 @@ class SocketEngine: NSObject, SRWebSocketDelegate { // Called when an error occurs. func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) { self.websocketConnected = false - self._websocket = false self._polling = true self.probing = false self.flushProbeWait() - self.client.webSocketDidFailWithError(error) + if self.websocket { + self.pingTimer?.invalidate() + self.client.webSocketDidFailWithError(error) + } } } \ No newline at end of file diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 9dcc88b..d40d570 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -38,7 +38,7 @@ class SocketIOClient { private var currentAck = -1 private var forcePolling = false private var handlers = [SocketEventHandler]() - private var lastSocketMessage:SocketEvent? + private var waitingData = [SocketEvent]() private var paramConnect = false private var _secure = false var closed = false @@ -620,7 +620,7 @@ class SocketIOClient { // Message is binary if let binary = message as? NSData { - if self.lastSocketMessage == nil { + if self.waitingData.isEmpty { return } @@ -667,7 +667,6 @@ class SocketIOClient { mutMessageObject = RegexMutable(binaryGroup[5]) if namespace == "" && self.nsp != nil { - self.lastSocketMessage = nil return } @@ -684,7 +683,7 @@ class SocketIOClient { placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt()) } - self.lastSocketMessage = mes + self.waitingData.append(mes) } else if binaryGroup[1].hasPrefix("6") { let messageType = RegexMutable(binaryGroup[1]) let numberOfPlaceholders = (messageType["6"] ~= "") as String @@ -706,8 +705,10 @@ class SocketIOClient { let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" - self.lastSocketMessage = SocketEvent(event: "", args: placeholdersRemoved, + let event = SocketEvent(event: "", args: placeholdersRemoved, placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true) + + self.waitingData.append(event) } /** End check for binary placeholders @@ -717,41 +718,42 @@ class SocketIOClient { // Handles binary data private func parseBinaryData(data:NSData) { - let shouldExecute = self.lastSocketMessage?.addData(data) + let shouldExecute = self.waitingData[0].addData(data) - if shouldExecute != nil && shouldExecute! { - var event = self.lastSocketMessage!.event - var parsedArgs:AnyObject? = SocketIOClient.parseData(self.lastSocketMessage!.args as? String) + if shouldExecute { + let socketEvent = self.waitingData.removeAtIndex(0) + var event = socketEvent.event + var parsedArgs:AnyObject? = SocketIOClient.parseData(socketEvent.args as? String) if let args:AnyObject = parsedArgs { - let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders(args) + let filledInArgs:AnyObject = socketEvent.fillInPlaceholders(args) - if self.lastSocketMessage!.justAck! { + if socketEvent.justAck! { // Should handle ack - self.handleAck(self.lastSocketMessage!.ack!, data: filledInArgs) + self.handleAck(socketEvent.ack!, data: filledInArgs) return } // Should do event - if self.lastSocketMessage!.ack != nil { + if socketEvent.ack != nil { self.handleEvent(event, data: filledInArgs, isInternalMessage: false, - wantsAck: self.lastSocketMessage!.ack!, withAckType: 6) + wantsAck: socketEvent.ack!, withAckType: 6) } else { self.handleEvent(event, data: filledInArgs) } } else { - let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders() + let filledInArgs:AnyObject = socketEvent.fillInPlaceholders() // Should handle ack - if self.lastSocketMessage!.justAck! { - self.handleAck(self.lastSocketMessage!.ack!, data: filledInArgs) + if socketEvent.justAck! { + self.handleAck(socketEvent.ack!, data: filledInArgs) return } // Should handle ack - if self.lastSocketMessage!.ack != nil { + if socketEvent.ack != nil { self.handleEvent(event, data: filledInArgs, isInternalMessage: false, - wantsAck: self.lastSocketMessage!.ack!, withAckType: 6) + wantsAck: socketEvent.ack!, withAckType: 6) } else { self.handleEvent(event, data: filledInArgs) }