handle binary data better
This commit is contained in:
parent
c85a1def87
commit
d35934c79d
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
|
||||
@ -250,33 +244,9 @@ 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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Translatation of engine.io-parser#decodePayload
|
||||
private func parsePollingMessage(str:String) {
|
||||
@ -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()
|
||||
|
||||
if self.websocket {
|
||||
self.pingTimer?.invalidate()
|
||||
self.client.webSocketDidFailWithError(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user