diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift index 0eff01d..0e42f6f 100644 --- a/SocketIO-iOSTests/SocketParserTest.swift +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -19,7 +19,9 @@ class SocketParserTest: XCTestCase { "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 19), "4/swift,": ("/swift", [], [], -1), "0/swift": ("/swift", [], [], -1), - "1/swift": ("/swift", [], [], -1)] + "1/swift": ("/swift", [], [], -1), + "4\"ERROR\"": ("/", ["ERROR"], [], -1), + "41": ("/", [1], [], -1)] func testDisconnect() { let message = "1" @@ -66,6 +68,16 @@ class SocketParserTest: XCTestCase { validateParseResult(message) } + func testErrorTypeString() { + let message = "4\"ERROR\"" + validateParseResult(message) + } + + func testErrorTypeInt() { + let message = "41" + validateParseResult(message) + } + func testInvalidInput() { let message = "8" switch SocketParser.parseString(message) { diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index ba68de9..6d3eae9 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -29,10 +29,10 @@ public final class SocketEngine: NSObject, WebSocketDelegate { private typealias ProbeWaitQueue = [Probe] private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet - private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL) - private let handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL) + private let emitQueue = dispatch_queue_create("com.socketio.engineEmitQueue", DISPATCH_QUEUE_SERIAL) + private let handleQueue = dispatch_queue_create("com.socketio.engineHandleQueue", DISPATCH_QUEUE_SERIAL) private let logType = "SocketEngine" - private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL) + private let parseQueue = dispatch_queue_create("com.socketio.engineParseQueue", DISPATCH_QUEUE_SERIAL) private let session: NSURLSession! private let workQueue = NSOperationQueue() diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index dbbec13..ef1de9f 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient { - private let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) + private let emitQueue = dispatch_queue_create("com.socketio.emitQueue", DISPATCH_QUEUE_SERIAL) private let handleQueue: dispatch_queue_t! public let socketURL: String diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index 64d359d..b25d8d0 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -54,7 +54,7 @@ class SocketParser { case .Disconnect: socket.didDisconnect("Got Disconnect") case .Error: - socket.didError("Error: \(pack.data)") + socket.didError(pack.data) default: Logger.log("Got invalid packet: %@", type: "SocketParser", args: pack.description) } @@ -93,7 +93,11 @@ class SocketParser { var idString = "" - while parser.hasNext { + if type == .Error { + parser.advanceIndexBy(-1) + } + + while parser.hasNext && type != .Error { if let int = Int(parser.read(1)) { idString += String(int) } else { @@ -107,7 +111,13 @@ class SocketParser { switch parseData(noPlaceholders) { case .Left(let err): - return .Left(err) + // If first you don't succeed, try again + if case let .Right(data) = parseData("\([noPlaceholders as AnyObject])") { + return .Right(SocketPacket(type: type, data: data, id: Int(idString) ?? -1, + nsp: namespace ?? "/", placeholders: placeholders)) + } else { + return .Left(err) + } case .Right(let data): return .Right(SocketPacket(type: type, data: data, id: Int(idString) ?? -1, nsp: namespace ?? "/", placeholders: placeholders))