work on xhr polling sending

This commit is contained in:
Erik 2015-03-04 18:02:42 -05:00
parent 2205cfb7d9
commit 4925c00c12
2 changed files with 98 additions and 46 deletions

View File

@ -30,7 +30,7 @@ private var fixSwift:AnyObject?
extension String { extension String {
private var length:Int { private var length:Int {
return Array(self).count return countElements(self)
} }
} }
@ -79,6 +79,22 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
} }
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
if self.websocket {
var byteArray = [UInt8](count: 1, repeatedValue: 0x0)
byteArray[0] = 4
var mutData = NSMutableData(bytes: &byteArray, length: 1)
mutData.appendData(data)
return (mutData, nil)
} else {
var str = "b4"
str += data.base64EncodedStringWithOptions(
NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
return (nil, str)
}
}
private func createURLs(params:[String: AnyObject]? = nil) -> (String, String) { private func createURLs(params:[String: AnyObject]? = nil) -> (String, String) {
var url = "\(self.client.socketURL)/socket.io/?transport=" var url = "\(self.client.socketURL)/socket.io/?transport="
var urlPolling:String var urlPolling:String
@ -120,28 +136,30 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
let time = Int(NSDate().timeIntervalSince1970) let time = Int(NSDate().timeIntervalSince1970)
let req = NSURLRequest(URL: NSURL(string: self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!) let req = NSURLRequest(URL:
NSURL(string: self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!)
self.wait = true self.wait = true
NSURLConnection.sendAsynchronousRequest(req, queue: self.pollingQueue) {[weak self] res, data, err in NSURLConnection.sendAsynchronousRequest(req,
if self == nil { queue: self.pollingQueue) {[weak self] res, data, err in
return if self == nil {
} else if err != nil { return
println(err) } else if err != nil {
self?.handlePollingFailed() // println(err)
return self?.handlePollingFailed()
} return
}
// println(data) // println(data)
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) { if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
// println(str) // println(str)
self?.parsePollingMessage(str) self?.parsePollingMessage(str)
} }
self?.wait = false self?.wait = false
self?.doPoll() self?.doPoll()
} }
} }
@ -159,7 +177,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if self == nil { if self == nil {
return return
} else if err != nil || data == nil { } else if err != nil || data == nil {
println(err) // println(err)
self?.handlePollingFailed() self?.handlePollingFailed()
return return
@ -188,16 +206,10 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
// println(json) // println(json)
self?.sid = sid self?.sid = sid
if let up = json["upgrades"] as? [String] { self?.ws = SRWebSocket(URL:
for available in up { NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
if available == "websocket" { self?.ws?.delegate = self
self?.ws = SRWebSocket(URL: // self?.ws?.open()
NSURL(string: urlWebSocket + "&sid=\(self!.sid)")!)
self?.ws?.delegate = self
self?.ws?.open()
}
}
}
} else { } else {
NSLog("Error handshaking") NSLog("Error handshaking")
return return
@ -218,6 +230,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
private func handlePollingFailed() { private func handlePollingFailed() {
if !self.client.reconnecting { if !self.client.reconnecting {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.wait = false
self.client.handleEvent("reconnect", data: "XHR polling timeout", isInternalMessage: true)
self.client.tryReconnect(triesLeft: self.client.reconnectAttempts) self.client.tryReconnect(triesLeft: self.client.reconnectAttempts)
} }
} }
@ -253,7 +267,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} else { } else {
if testLength(length, &n) || length == "" { if testLength(length, &n) || length == "" {
println("parsing error at testlength") println("parsing error at testlength")
return exit(1)
} }
msg = String(strArray[i+1...i+n]) msg = String(strArray[i+1...i+n])
@ -261,7 +275,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if let lengthInt = length.toInt() { if let lengthInt = length.toInt() {
if lengthInt != msg.length { if lengthInt != msg.length {
println("parsing error") println("parsing error")
return exit(1)
} }
} }
@ -331,7 +345,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
if !(msg is NSData) { if !(msg is NSData) {
self.ws?.send("\(PacketType.MESSAGE.rawValue)\(msg)") self.ws?.send("\(PacketType.MESSAGE.rawValue)\(msg)")
} else { } else {
self.ws?.send(msg) let (data, nilString) = self.createBinaryDataForSend(msg as NSData)
self.ws?.send(data!)
} }
} else { } else {
self.sendPollMessage(msg) self.sendPollMessage(msg)
@ -370,7 +385,42 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
func sendPollMessage(msg:AnyObject) { func sendPollMessage(msg:AnyObject) {
var postData:NSData
let time = Int(NSDate().timeIntervalSince1970)
var req = NSMutableURLRequest(URL:
NSURL(string:self.urlPolling! + "&t=\(time)&b64=1" + "&sid=\(self.sid)")!)
req.HTTPMethod = "POST"
req.setValue("application/html-text", forHTTPHeaderField: "Content-Type")
if msg is NSData {
println("sending poll binary")
let (nilData, data) = self.createBinaryDataForSend(msg as NSData)
let dataLen = countElements(data!)
postData = "\(dataLen):\(data!)".dataUsingEncoding(NSUTF8StringEncoding,
allowLossyConversion: false)!
} else if !(msg is String) {
return
} else {
// println(msg)
let strMsg = "\(PacketType.MESSAGE.rawValue)\(msg as String)"
// println(strMsg)
let postCount = countElements(strMsg)
postData = ("\(postCount):\(strMsg)").dataUsingEncoding(NSUTF8StringEncoding,
allowLossyConversion: false)!
}
req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length")
req.HTTPBody = postData
NSURLConnection.sendAsynchronousRequest(req, queue: self.pollingQueue) {[weak self] res, data, err in
if err != nil {
println(err)
return
}
}
} }
// Starts the ping timer // Starts the ping timer

View File

@ -109,13 +109,13 @@ class SocketIOClient {
} }
// Creates a binary message, ready for sending // Creates a binary message, ready for sending
private class func createBinaryDataForSend(data:NSData) -> NSData { // private class func createBinaryDataForSend(data:NSData) -> NSData {
var byteArray = [UInt8](count: 1, repeatedValue: 0x0) // var byteArray = [UInt8](count: 1, repeatedValue: 0x0)
byteArray[0] = 4 // byteArray[0] = 4
var mutData = NSMutableData(bytes: &byteArray, length: 1) // var mutData = NSMutableData(bytes: &byteArray, length: 1)
mutData.appendData(data) // mutData.appendData(data)
return mutData // return mutData
} // }
func didConnect() { func didConnect() {
self.closed = false self.closed = false
@ -317,7 +317,7 @@ class SocketIOClient {
for g in 0..<arr.count { for g in 0..<arr.count {
if arr[g] is NSData { if arr[g] is NSData {
hasBinary = true hasBinary = true
let sendData = self.createBinaryDataForSend(arr[g] as NSData) let sendData = arr[g] as NSData
arrayDatas.append(sendData) arrayDatas.append(sendData)
replacementArr[g] = ["_placeholder": true, replacementArr[g] = ["_placeholder": true,
@ -412,11 +412,10 @@ class SocketIOClient {
} else if let binaryData = args[i] as? NSData { } else if let binaryData = args[i] as? NSData {
// args is just binary // args is just binary
hasBinary = true hasBinary = true
let sendData = SocketIOClient.createBinaryDataForSend(binaryData)
numberOfPlaceholders++ numberOfPlaceholders++
items[i] = ["_placeholder": true, "num": numberOfPlaceholders] items[i] = ["_placeholder": true, "num": numberOfPlaceholders]
emitDatas.append(sendData) emitDatas.append(binaryData)
} else { } else {
items[i] = args[i] items[i] = args[i]
} }
@ -437,8 +436,8 @@ class SocketIOClient {
for (key, value) in dict { for (key, value) in dict {
if let binaryData = value as? NSData { if let binaryData = value as? NSData {
hasBinary = true hasBinary = true
let sendData = self.createBinaryDataForSend(binaryData)
returnDatas.append(sendData) returnDatas.append(binaryData)
returnDict[key as String] = ["_placeholder": true, "num": placeholders++] returnDict[key as String] = ["_placeholder": true, "num": placeholders++]
} else if let arr = value as? NSArray { } else if let arr = value as? NSArray {
let (replace, hadBinary, arrDatas) = self.parseArray(arr, placeholders: placeholders) let (replace, hadBinary, arrDatas) = self.parseArray(arr, placeholders: placeholders)
@ -751,7 +750,10 @@ class SocketIOClient {
// We lost connection and should attempt to reestablish // We lost connection and should attempt to reestablish
func tryReconnect(var #triesLeft:Int) { func tryReconnect(var #triesLeft:Int) {
self.connected = false
if triesLeft != -1 && triesLeft <= 0 { if triesLeft != -1 && triesLeft <= 0 {
self.connected = false
self.connecting = false self.connecting = false
self.reconnects = false self.reconnects = false
self.reconnecting = false self.reconnecting = false