From d6c521123b8064b25e51b6d1bbb557258dca85b7 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 16 Jan 2016 17:23:07 -0500 Subject: [PATCH] refactor closing engine --- Source/SocketEngine.swift | 56 +++++++++++++------------- Source/SocketEnginePollable.swift | 67 +++++++++++++++++-------------- 2 files changed, 64 insertions(+), 59 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index fec7df4..6e16ed5 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -132,8 +132,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb case 0: // Unknown transport didError(error) case 1: // Unknown sid. clear and retry connect - sid = "" - open(connectParams) + didError(error) case 2: // Bad handshake request didError(error) case 3: // Bad request @@ -164,22 +163,29 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } public func close(reason: String) { - DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) - - pingTimer?.invalidate() - closed = true - invalidated = true - connected = false - - if websocket { - sendWebSocketMessage("", withType: .Close, withData: []) - } else { - sendPollMessage("", withType: .Close, withData: []) + func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) { + sid = "" + closed = true + invalidated = true + connected = false + + pingTimer?.invalidate() + ws?.disconnect() + stopPolling() + client?.engineDidClose(reason) } - ws?.disconnect() - stopPolling() - client?.engineDidClose(reason) + DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) + + if websocket { + sendWebSocketMessage("", withType: .Close, withData: []) + postSendClose(nil, nil, nil) + } else { + // We need to take special care when we're polling that we send it ASAP + postWait.append("1") + let req = createRequestForPostWithPostWait() + doRequest(req, withCallback: postSendClose) + } } private func createURLs(params: [String: AnyObject]?) -> (String, String) { @@ -250,14 +256,9 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } public func didError(error: String) { - connected = false - ws?.disconnect() - stopPolling() - pingTimer?.invalidate() - DefaultSocketLogger.Logger.error(error, type: logType) client?.engineDidError(error) - client?.engineDidClose(error) + close(error) } public func doFastUpgrade() { @@ -364,15 +365,14 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - public func open(opts: [String: AnyObject]? = nil) { - connectParams = opts - + public func open(opts: [String: AnyObject]?) { if connected { - DefaultSocketLogger.Logger.error("Tried to open while connected", type: logType) - didError("Tried to open engine while connected") - + DefaultSocketLogger.Logger.error("Engine tried opening while connected. This is probably a programming error. " + + "Abandoning open attempt", type: logType) return } + + connectParams = opts DefaultSocketLogger.Logger.log("Starting engine", type: logType) DefaultSocketLogger.Logger.log("Handshaking", type: logType) diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 0da2ed9..46c8ea0 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -58,6 +58,33 @@ extension SocketEnginePollable { } } + func createRequestForPostWithPostWait() -> NSURLRequest { + var postStr = "" + + for packet in postWait { + let len = packet.characters.count + + postStr += "\(len):\(packet)" + } + + postWait.removeAll(keepCapacity: false) + + let req = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&sid=\(sid)")!) + + addHeaders(req) + + req.HTTPMethod = "POST" + req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type") + + let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding, + allowLossyConversion: false)! + + req.HTTPBody = postData + req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length") + + return req + } + public func doPoll() { if websocket || waitingForPoll || !connected || closed { return @@ -70,10 +97,9 @@ extension SocketEnginePollable { doLongPoll(req) } - private func doRequest(req: NSURLRequest, - withCallback callback: (NSData?, NSURLResponse?, NSError?) -> Void) { + func doRequest(req: NSURLRequest, withCallback callback: (NSData?, NSURLResponse?, NSError?) -> Void) { if !polling || closed || invalidated { - DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEngine") + DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling") return } @@ -87,7 +113,7 @@ extension SocketEnginePollable { guard let this = self else {return} if err != nil || data == nil { - DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEngine") + DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { this.didError(err?.localizedDescription ?? "Error") @@ -96,7 +122,7 @@ extension SocketEnginePollable { return } - DefaultSocketLogger.Logger.log("Got polling response", type: "SocketEngine") + DefaultSocketLogger.Logger.log("Got polling response", type: "SocketEnginePolling") if let str = String(data: data!, encoding: NSUTF8StringEncoding) { dispatch_async(this.parseQueue) { @@ -122,38 +148,17 @@ extension SocketEnginePollable { return } - var postStr = "" - - for packet in postWait { - let len = packet.characters.count - - postStr += "\(len):\(packet)" - } - - postWait.removeAll(keepCapacity: false) - - let req = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&sid=\(sid)")!) - - addHeaders(req) - - req.HTTPMethod = "POST" - req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type") - - let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding, - allowLossyConversion: false)! - - req.HTTPBody = postData - req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length") + let req = createRequestForPostWithPostWait() waitingForPost = true - DefaultSocketLogger.Logger.log("POSTing: %@", type: "SocketEngine", args: postStr) + DefaultSocketLogger.Logger.log("POSTing: %@", type: "SocketEngine", args: postWait) doRequest(req) {[weak self] data, res, err in - guard let this = self else {return} + guard let this = self else { return } if err != nil { - DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEngine") + DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") if this.polling { this.didError(err?.localizedDescription ?? "Error") @@ -199,7 +204,7 @@ extension SocketEnginePollable { /// Send polling message. /// Only call on emitQueue public func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { - DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEngine", args: message, type.rawValue) + DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue) let fixedMessage = doubleEncodeUTF8(message) let strMsg = "\(type.rawValue)\(fixedMessage)"