refactor closing engine

This commit is contained in:
Erik 2016-01-16 17:23:07 -05:00
parent 024384dc82
commit d6c521123b
2 changed files with 64 additions and 59 deletions

View File

@ -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)

View File

@ -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)"