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 self.forcePolling = forcePolling
} }
func close(forced:Bool = false) { func close() {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
if !forced {
self.send(PacketType.CLOSE.rawValue) self.send(PacketType.CLOSE.rawValue)
self.ws?.close()
} else {
self.client.didForceClose()
}
} }
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@ -250,33 +244,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.wait = false 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()
} }
} }
}
// Translatation of engine.io-parser#decodePayload // Translatation of engine.io-parser#decodePayload
private func parsePollingMessage(str:String) { private func parsePollingMessage(str:String) {
@ -361,6 +331,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if let data = NSData(base64EncodedString: messageString, if let data = NSData(base64EncodedString: messageString,
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) {
// println("sending \(data)")
self?.client.parseSocketMessage(data) self?.client.parseSocketMessage(data)
} }
@ -368,7 +339,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
if messageString == PacketType.CLOSE.rawValue { if messageString == PacketType.CLOSE.rawValue {
self?.close(forced: true) // do nothing
return return
} }
// println("Got something idk what to do with") // println("Got something idk what to do with")
@ -377,6 +348,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// Remove message type // Remove message type
messageString.removeAtIndex(messageString.startIndex) messageString.removeAtIndex(messageString.startIndex)
// println("sending \(messageString)")
self?.client.parseSocketMessage(messageString) self?.client.parseSocketMessage(messageString)
} }
} }
@ -553,11 +526,13 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// Called when an error occurs. // Called when an error occurs.
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) { func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) {
self.websocketConnected = false self.websocketConnected = false
self._websocket = false
self._polling = true self._polling = true
self.probing = false self.probing = false
self.flushProbeWait() self.flushProbeWait()
if self.websocket {
self.pingTimer?.invalidate()
self.client.webSocketDidFailWithError(error) self.client.webSocketDidFailWithError(error)
} }
}
} }

View File

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