handle binary data better
This commit is contained in:
parent
c85a1def87
commit
d35934c79d
@ -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()
|
||||||
|
self.send(PacketType.CLOSE.rawValue)
|
||||||
if !forced {
|
|
||||||
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,31 +244,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
|
|||||||
self.pingTimer?.invalidate()
|
self.pingTimer?.invalidate()
|
||||||
self.wait = false
|
self.wait = false
|
||||||
|
|
||||||
let forced = {() -> Bool in
|
self.client.pollingDidFail()
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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()
|
||||||
|
|
||||||
self.client.webSocketDidFailWithError(error)
|
if self.websocket {
|
||||||
|
self.pingTimer?.invalidate()
|
||||||
|
self.client.webSocketDidFailWithError(error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user