start work on parsing polling messages

This commit is contained in:
Erik 2015-03-04 13:27:55 -05:00
parent 7f22dc8f42
commit 574e9d5f7e

View File

@ -24,6 +24,12 @@
import Foundation
extension String {
private var length:Int {
return Array(self).count
}
}
private enum PacketType: String {
case OPEN = "0"
case CLOSE = "1"
@ -40,6 +46,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
private var pingTimer:NSTimer?
private var pollingTimer:NSTimer?
private var _polling = true
private var wait = false
private var _websocket = false
private var websocketConnected = false
var pingInterval:Int?
@ -62,9 +69,11 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self.pingTimer?.invalidate()
self.pollingTimer?.invalidate()
if websocketConnected {
if self.websocket {
self.ws?.send(PacketType.MESSAGE.rawValue + PacketType.CLOSE.rawValue)
self.ws?.close()
} else {
// TODO handling polling
}
}
@ -104,26 +113,45 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
}
func doPoll() {
if self.urlPolling == nil || self.websocket {
if self.urlPolling == nil || self.websocket || self.wait {
return
}
let time = Int(NSDate().timeIntervalSince1970)
let req = NSURLRequest(URL: NSURL(string: self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!)
self.wait = true
NSURLConnection.sendAsynchronousRequest(req, queue: self.pollingQueue) {[weak self] res, data, err in
if self == nil {
return
} else if err != nil {
println(err)
self?.handlePollingFailed()
return
}
let str = NSString(data: data, encoding: NSUTF8StringEncoding)
println(str)
// TODO parse packets
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
// println(str)
var mut = RegexMutable(str)
let groups = mut["(\\d):(.*)"].groups()
if groups[1] == "" || groups[2] == "" {
return
}
let type = groups[1]
var mutPart = RegexMutable(groups[0])
if type != "2" {
return
}
mutPart["^2:40"] ~= ""
self?.parsePollingMessage(mutPart)
self?.wait = false
self?.doPoll()
}
}
}
@ -141,12 +169,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if self == nil {
return
} else if err != nil || data == nil {
println("Error")
println(err)
if !self!.client.reconnecting {
self?.client.tryReconnect(triesLeft: self!.client.reconnectAttempts)
}
self?.handlePollingFailed()
return
}
if let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) {
@ -170,10 +196,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self?.sid = sid
self?.client.didConnect()
self?.client.handleEvent("connect", data: nil, isInternalMessage: false)
self?.ws = SRWebSocket(URL: NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
self?.ws?.delegate = self
self?.ws?.open()
//self?.ws?.open()
} else {
NSLog("Error handshaking")
@ -192,11 +218,71 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
}
}
func handlePollingResponse(str:String) {
// TODO add polling
// A poll failed, try and reconnect
private func handlePollingFailed() {
if !self.client.reconnecting {
self.pingTimer?.invalidate()
self.client.tryReconnect(triesLeft: self.client.reconnectAttempts)
}
}
func parseWebSocketMessage(message:AnyObject?) {
// Translatation of engine.io-parser#decodePayload
func parsePollingMessage(str:String) {
if str.length == 1 {
return
}
// println(str)
var length = ""
var n = 0
var msg = ""
func testLength(length:String, inout n:Int) -> Bool {
if let num = length.toInt() {
n = num
if num != n {
return true
}
}
return false
}
for var i = 0, l = str.length; i < l; i++ {
let strArray = Array(str)
let chr = String(strArray[i])
if chr != ":" {
length += chr
} else {
if testLength(length, &n) || length == "" {
println("parsing error at testlength")
return
}
msg = String(strArray[i+1...i+n])
if let lengthInt = length.toInt() {
if lengthInt != msg.length {
println("parsing error")
return
}
}
if msg.length != 0 {
self.parseEngineMessage(msg)
}
i += n
length = ""
}
}
}
func parseEngineMessage(message:AnyObject?) {
// println(message)
if let data = message as? NSData {
// Strip off message type
self.client.parseSocketMessage(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
@ -212,13 +298,15 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
return
}
let type = strMessage["(\\d)"].matches()[0]
let type = strMessage["^(\\d)"].groups()?[1]
if type != PacketType.MESSAGE.rawValue {
// TODO Handle other packets
println(message)
return
}
// Remove message type
message.removeAtIndex(message.startIndex)
self.client.parseSocketMessage(message)
}
@ -263,10 +351,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
return
} else if err != nil {
println(err)
self?.pingTimer?.invalidate()
if !self!.client.reconnecting {
self?.client.tryReconnect(triesLeft: self!.client.reconnectAttempts)
}
self?.handlePollingFailed()
return
}
@ -305,7 +390,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
func webSocket(webSocket:SRWebSocket!, didReceiveMessage message:AnyObject?) {
// println(message)
self.parseWebSocketMessage(message)
self.parseEngineMessage(message)
}
// Called when the socket is opened