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 case 0: // Unknown transport
didError(error) didError(error)
case 1: // Unknown sid. clear and retry connect case 1: // Unknown sid. clear and retry connect
sid = "" didError(error)
open(connectParams)
case 2: // Bad handshake request case 2: // Bad handshake request
didError(error) didError(error)
case 3: // Bad request case 3: // Bad request
@ -164,24 +163,31 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
} }
public func close(reason: String) { public func close(reason: String) {
DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType) func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) {
sid = ""
pingTimer?.invalidate()
closed = true closed = true
invalidated = true invalidated = true
connected = false connected = false
if websocket { pingTimer?.invalidate()
sendWebSocketMessage("", withType: .Close, withData: [])
} else {
sendPollMessage("", withType: .Close, withData: [])
}
ws?.disconnect() ws?.disconnect()
stopPolling() stopPolling()
client?.engineDidClose(reason) 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) { private func createURLs(params: [String: AnyObject]?) -> (String, String) {
if client == nil { if client == nil {
return ("", "") return ("", "")
@ -250,14 +256,9 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
} }
public func didError(error: String) { public func didError(error: String) {
connected = false
ws?.disconnect()
stopPolling()
pingTimer?.invalidate()
DefaultSocketLogger.Logger.error(error, type: logType) DefaultSocketLogger.Logger.error(error, type: logType)
client?.engineDidError(error) client?.engineDidError(error)
client?.engineDidClose(error) close(error)
} }
public func doFastUpgrade() { public func doFastUpgrade() {
@ -364,16 +365,15 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
} }
} }
public func open(opts: [String: AnyObject]? = nil) { public func open(opts: [String: AnyObject]?) {
connectParams = opts
if connected { if connected {
DefaultSocketLogger.Logger.error("Tried to open while connected", type: logType) DefaultSocketLogger.Logger.error("Engine tried opening while connected. This is probably a programming error. "
didError("Tried to open engine while connected") + "Abandoning open attempt", type: logType)
return return
} }
connectParams = opts
DefaultSocketLogger.Logger.log("Starting engine", type: logType) DefaultSocketLogger.Logger.log("Starting engine", type: logType)
DefaultSocketLogger.Logger.log("Handshaking", 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() { public func doPoll() {
if websocket || waitingForPoll || !connected || closed { if websocket || waitingForPoll || !connected || closed {
return return
@ -70,10 +97,9 @@ extension SocketEnginePollable {
doLongPoll(req) doLongPoll(req)
} }
private func doRequest(req: NSURLRequest, func doRequest(req: NSURLRequest, withCallback callback: (NSData?, NSURLResponse?, NSError?) -> Void) {
withCallback callback: (NSData?, NSURLResponse?, NSError?) -> Void) {
if !polling || closed || invalidated { 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 return
} }
@ -87,7 +113,7 @@ extension SocketEnginePollable {
guard let this = self else {return} guard let this = self else {return}
if err != nil || data == nil { if err != nil || data == nil {
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEngine") DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling")
if this.polling { if this.polling {
this.didError(err?.localizedDescription ?? "Error") this.didError(err?.localizedDescription ?? "Error")
@ -96,7 +122,7 @@ extension SocketEnginePollable {
return 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) { if let str = String(data: data!, encoding: NSUTF8StringEncoding) {
dispatch_async(this.parseQueue) { dispatch_async(this.parseQueue) {
@ -122,38 +148,17 @@ extension SocketEnginePollable {
return return
} }
var postStr = "" let req = createRequestForPostWithPostWait()
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")
waitingForPost = true 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 doRequest(req) {[weak self] data, res, err in
guard let this = self else { return } guard let this = self else { return }
if err != nil { if err != nil {
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEngine") DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling")
if this.polling { if this.polling {
this.didError(err?.localizedDescription ?? "Error") this.didError(err?.localizedDescription ?? "Error")
@ -199,7 +204,7 @@ extension SocketEnginePollable {
/// Send polling message. /// Send polling message.
/// Only call on emitQueue /// Only call on emitQueue
public func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) { 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 fixedMessage = doubleEncodeUTF8(message)
let strMsg = "\(type.rawValue)\(fixedMessage)" let strMsg = "\(type.rawValue)\(fixedMessage)"