handle binary data better

This commit is contained in:
Erik 2015-03-05 14:37:00 -05:00
parent c85a1def87
commit d35934c79d
2 changed files with 32 additions and 55 deletions

View File

@ -76,15 +76,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.forcePolling = forcePolling
}
func close(forced:Bool = false) {
func close() {
self.pingTimer?.invalidate()
if !forced {
self.send(PacketType.CLOSE.rawValue)
self.ws?.close()
} else {
self.client.didForceClose()
}
self.send(PacketType.CLOSE.rawValue)
}
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@ -250,31 +244,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.pingTimer?.invalidate()
self.wait = false
let forced = {() -> Bool in
var err:NSError?
let url = NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!
let req = NSURLRequest(URL: url, cachePolicy:
NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 4)
var resp:NSURLResponse?
let data = NSURLConnection.sendSynchronousRequest(req, returningResponse: &resp, error: &err)
if data == nil || resp == nil || err != nil {
return false
} else if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) {
if str == "1:61:1" {
return true
} else {
return false
}
} else {
return false
}}()
if forced {
self.close(forced: true)
} else {
self.client.pollingDidFail()
}
self.client.pollingDidFail()
}
}
@ -361,6 +331,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if let data = NSData(base64EncodedString: messageString,
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) {
// println("sending \(data)")
self?.client.parseSocketMessage(data)
}
@ -368,7 +339,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
}
if messageString == PacketType.CLOSE.rawValue {
self?.close(forced: true)
// do nothing
return
}
// println("Got something idk what to do with")
@ -377,6 +348,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// Remove message type
messageString.removeAtIndex(messageString.startIndex)
// println("sending \(messageString)")
self?.client.parseSocketMessage(messageString)
}
}
@ -553,11 +526,13 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// Called when an error occurs.
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) {
self.websocketConnected = false
self._websocket = false
self._polling = true
self.probing = false
self.flushProbeWait()
self.client.webSocketDidFailWithError(error)
if self.websocket {
self.pingTimer?.invalidate()
self.client.webSocketDidFailWithError(error)
}
}
}

View File

@ -38,7 +38,7 @@ class SocketIOClient {
private var currentAck = -1
private var forcePolling = false
private var handlers = [SocketEventHandler]()
private var lastSocketMessage:SocketEvent?
private var waitingData = [SocketEvent]()
private var paramConnect = false
private var _secure = false
var closed = false
@ -620,7 +620,7 @@ class SocketIOClient {
// Message is binary
if let binary = message as? NSData {
if self.lastSocketMessage == nil {
if self.waitingData.isEmpty {
return
}
@ -667,7 +667,6 @@ class SocketIOClient {
mutMessageObject = RegexMutable(binaryGroup[5])
if namespace == "" && self.nsp != nil {
self.lastSocketMessage = nil
return
}
@ -684,7 +683,7 @@ class SocketIOClient {
placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt())
}
self.lastSocketMessage = mes
self.waitingData.append(mes)
} else if binaryGroup[1].hasPrefix("6") {
let messageType = RegexMutable(binaryGroup[1])
let numberOfPlaceholders = (messageType["6"] ~= "") as String
@ -706,8 +705,10 @@ class SocketIOClient {
let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"]
~= "\"~~$2\""
self.lastSocketMessage = SocketEvent(event: "", args: placeholdersRemoved,
let event = SocketEvent(event: "", args: placeholdersRemoved,
placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true)
self.waitingData.append(event)
}
/**
End check for binary placeholders
@ -717,41 +718,42 @@ class SocketIOClient {
// Handles binary data
private func parseBinaryData(data:NSData) {
let shouldExecute = self.lastSocketMessage?.addData(data)
let shouldExecute = self.waitingData[0].addData(data)
if shouldExecute != nil && shouldExecute! {
var event = self.lastSocketMessage!.event
var parsedArgs:AnyObject? = SocketIOClient.parseData(self.lastSocketMessage!.args as? String)
if shouldExecute {
let socketEvent = self.waitingData.removeAtIndex(0)
var event = socketEvent.event
var parsedArgs:AnyObject? = SocketIOClient.parseData(socketEvent.args as? String)
if let args:AnyObject = parsedArgs {
let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders(args)
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders(args)
if self.lastSocketMessage!.justAck! {
if socketEvent.justAck! {
// Should handle ack
self.handleAck(self.lastSocketMessage!.ack!, data: filledInArgs)
self.handleAck(socketEvent.ack!, data: filledInArgs)
return
}
// Should do event
if self.lastSocketMessage!.ack != nil {
if socketEvent.ack != nil {
self.handleEvent(event, data: filledInArgs, isInternalMessage: false,
wantsAck: self.lastSocketMessage!.ack!, withAckType: 6)
wantsAck: socketEvent.ack!, withAckType: 6)
} else {
self.handleEvent(event, data: filledInArgs)
}
} else {
let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders()
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders()
// Should handle ack
if self.lastSocketMessage!.justAck! {
self.handleAck(self.lastSocketMessage!.ack!, data: filledInArgs)
if socketEvent.justAck! {
self.handleAck(socketEvent.ack!, data: filledInArgs)
return
}
// Should handle ack
if self.lastSocketMessage!.ack != nil {
if socketEvent.ack != nil {
self.handleEvent(event, data: filledInArgs, isInternalMessage: false,
wantsAck: self.lastSocketMessage!.ack!, withAckType: 6)
wantsAck: socketEvent.ack!, withAckType: 6)
} else {
self.handleEvent(event, data: filledInArgs)
}