From 332ff6f40bfa592d41f42d03b2a966ba0f72fbba Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 9 Apr 2015 01:39:27 -0400 Subject: [PATCH] handle error message --- SwiftIO/SocketEngine.swift | 9 ++- SwiftIO/SocketEngineClient.swift | 2 +- SwiftIO/SocketIOClient.swift | 14 ++-- SwiftIO/SocketParser.swift | 107 ++++++++++++++++--------------- 4 files changed, 71 insertions(+), 61 deletions(-) diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index 26d28b3..8b997e7 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -349,7 +349,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { public func open(opts:[String: AnyObject]? = nil) { if self.connected { - self.client?.engineDidError("Engine tried to open while connected") + self.client?.didError("Engine tried to open while connected") return } @@ -478,9 +478,8 @@ public class SocketEngine: NSObject, WebSocketDelegate { message.removeAtIndex(message.startIndex) let mesData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! - if let json = NSJSONSerialization.JSONObjectWithData(mesData, - options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary, - let sid = json["sid"] as? String { + if let json = NSJSONSerialization.JSONObjectWithData(mesData, options: NSJSONReadingOptions.AllowFragments, + error: &err) as? NSDictionary, let sid = json["sid"] as? String { self.sid = sid self._connected = true @@ -492,7 +491,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { self.pingInterval = pingInterval / 1000 } } else { - self.client?.engineDidError("Engine failed to handshake") + self.client?.didError("Engine failed to handshake") return } diff --git a/SwiftIO/SocketEngineClient.swift b/SwiftIO/SocketEngineClient.swift index 6c4a7db..3189536 100644 --- a/SwiftIO/SocketEngineClient.swift +++ b/SwiftIO/SocketEngineClient.swift @@ -32,7 +32,7 @@ import Foundation var socketURL:String {get} var secure:Bool {get} - func engineDidError(reason:String) + func didError(reason:AnyObject) func engineDidForceClose(reason:String) func parseSocketMessage(msg:String) func parseBinaryData(data:NSData) diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index d2cd706..7d5247e 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -226,6 +226,15 @@ public class SocketIOClient: NSObject, SocketEngineClient { self.handleEvent("connect", data: nil, isInternalMessage: false) } + /// error + public func didError(reason:AnyObject) { + if !(reason is [AnyObject]) { + self.handleEvent("error", data: [reason], isInternalMessage: true) + } else { + self.handleEvent("error", data: reason as? [AnyObject], isInternalMessage: true) + } + } + /** Same as close */ @@ -321,11 +330,6 @@ public class SocketIOClient: NSObject, SocketEngineClient { } } - /// Engine error - public func engineDidError(reason:String) { - self.handleEvent("error", data: [reason], isInternalMessage: true) - } - /// Server wants us to die public func engineDidForceClose(reason:String) { if self.closed { diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index 6f6f344..a3a468b 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -24,46 +24,46 @@ import Foundation class SocketParser { private static let shredder = SocketParser.PacketShredder() - + // Translation of socket.io-parser#deconstructPacket private class PacketShredder { var buf = ContiguousArray() - + func shred(data:AnyObject) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": buf.count] - + buf.append(bin) - + return placeholder } else if let arr = data as? NSArray { var newArr = NSMutableArray(array: arr) - + for i in 0.. SocketPacket? { let arr = Array(str) let type = String(arr[0]) - + if arr.count == 1 { return SocketPacket(type: SocketPacketType(str: type)) } - + var id = nil as Int? var nsp = "" var i = 0 var placeholders = -1 - + if type == "5" || type == "6" { var buf = "" - + while arr[++i] != "-" { buf += String(arr[i]) if i == arr.count { break } } - + if buf.toInt() == nil || arr[i] != "-" { NSLog("Error parsing \(str)") return nil @@ -110,26 +110,26 @@ class SocketParser { placeholders = buf.toInt()! } } - + if arr[i + 1] == "/" { while ++i < arr.count { let c = arr[i] - + if c == "," { break } - + nsp += String(c) } } - + if i + 1 >= arr.count { return SocketPacket(type: SocketPacketType(str: type), nsp: nsp, placeholders: placeholders, id: id) } - + let next = String(arr[i + 1]) - + if next.toInt() != nil { var c = "" while ++i < arr.count { @@ -140,78 +140,83 @@ class SocketParser { break } } - + id = c.toInt() } - - if i + 1 < arr.count { - let d = String(arr[++i...arr.count-1]) + + if ++i < arr.count { + let d = String(arr[i...arr.count-1]) let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\"" - - let data = SocketParser.parseData(noPlaceholders) as! [AnyObject] - + let data:[AnyObject] + + if let isArr = SocketParser.parseData(noPlaceholders) as? [AnyObject] { + data = isArr + } else { + data = [noPlaceholders] + } + return SocketPacket(type: SocketPacketType(str: type), data: data, nsp: nsp, placeholders: placeholders, id: id) } - + return nil } - + // Parses data for events static func parseData(data:String) -> AnyObject? { var err:NSError? let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.AllowFragments, error: &err) - + if err != nil { // println(err) return nil } - + return parsed } - + static func parseForEmit(packet:SocketPacket) { shredder.deconstructPacket(packet) } - + // Parses messages recieved static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { if stringMessage == "" { return } - + func checkNSP(nsp:String) -> Bool { return nsp == "" && socket.nsp != "/" } - + let p = parseString(stringMessage) as SocketPacket! - + if p.type == SocketPacketType.EVENT { if checkNSP(p.nsp) { return } - + socket.handleEvent(p.getEvent(), data: p.data, isInternalMessage: false, wantsAck: p.id) } else if p.type == SocketPacketType.ACK { if checkNSP(p.nsp) { return } - + socket.handleAck(p.id!, data: p.data) } else if p.type == SocketPacketType.BINARY_EVENT { if checkNSP(p.nsp) { return } - + socket.waitingData.append(p) } else if p.type == SocketPacketType.BINARY_ACK { if checkNSP(p.nsp) { return } - + p.justAck = true socket.waitingData.append(p) } else if p.type == SocketPacketType.CONNECT { @@ -224,27 +229,29 @@ class SocketParser { } } else if p.type == SocketPacketType.DISCONNECT { socket.engineDidForceClose("Got Disconnect") + } else if p.type == SocketPacketType.ERROR { + socket.didError(p.data == nil ? "Error" : p.data!) } } - + // Handles binary data static 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 { return } - + let packet = socket.waitingData.removeAtIndex(0) packet.fillInPlaceholders() - + if !packet.justAck { socket.handleEvent(packet.getEvent(), data: packet.data, wantsAck: packet.id)