Skip to content

Commit d35934c

Browse files
committed
handle binary data better
1 parent c85a1de commit d35934c

File tree

2 files changed

+32
-55
lines changed

2 files changed

+32
-55
lines changed

SwiftIO/SocketEngine.swift

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,9 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
7676
self.forcePolling = forcePolling
7777
}
7878

79-
func close(forced:Bool = false) {
79+
func close() {
8080
self.pingTimer?.invalidate()
81-
82-
if !forced {
83-
self.send(PacketType.CLOSE.rawValue)
84-
self.ws?.close()
85-
} else {
86-
self.client.didForceClose()
87-
}
81+
self.send(PacketType.CLOSE.rawValue)
8882
}
8983

9084
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@@ -250,31 +244,7 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
250244
self.pingTimer?.invalidate()
251245
self.wait = false
252246

253-
let forced = {() -> Bool in
254-
var err:NSError?
255-
let url = NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!
256-
let req = NSURLRequest(URL: url, cachePolicy:
257-
NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 4)
258-
var resp:NSURLResponse?
259-
let data = NSURLConnection.sendSynchronousRequest(req, returningResponse: &resp, error: &err)
260-
261-
if data == nil || resp == nil || err != nil {
262-
return false
263-
} else if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) {
264-
if str == "1:61:1" {
265-
return true
266-
} else {
267-
return false
268-
}
269-
} else {
270-
return false
271-
}}()
272-
273-
if forced {
274-
self.close(forced: true)
275-
} else {
276-
self.client.pollingDidFail()
277-
}
247+
self.client.pollingDidFail()
278248
}
279249
}
280250

@@ -361,14 +331,15 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
361331

362332
if let data = NSData(base64EncodedString: messageString,
363333
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) {
334+
// println("sending \(data)")
364335
self?.client.parseSocketMessage(data)
365336
}
366337

367338
return
368339
}
369340

370341
if messageString == PacketType.CLOSE.rawValue {
371-
self?.close(forced: true)
342+
// do nothing
372343
return
373344
}
374345
// println("Got something idk what to do with")
@@ -377,6 +348,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
377348

378349
// Remove message type
379350
messageString.removeAtIndex(messageString.startIndex)
351+
// println("sending \(messageString)")
352+
380353
self?.client.parseSocketMessage(messageString)
381354
}
382355
}
@@ -553,11 +526,13 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
553526
// Called when an error occurs.
554527
func webSocket(webSocket:SRWebSocket!, didFailWithError error:NSError!) {
555528
self.websocketConnected = false
556-
self._websocket = false
557529
self._polling = true
558530
self.probing = false
559531
self.flushProbeWait()
560532

561-
self.client.webSocketDidFailWithError(error)
533+
if self.websocket {
534+
self.pingTimer?.invalidate()
535+
self.client.webSocketDidFailWithError(error)
536+
}
562537
}
563538
}

SwiftIO/SocketIOClient.swift

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class SocketIOClient {
3838
private var currentAck = -1
3939
private var forcePolling = false
4040
private var handlers = [SocketEventHandler]()
41-
private var lastSocketMessage:SocketEvent?
41+
private var waitingData = [SocketEvent]()
4242
private var paramConnect = false
4343
private var _secure = false
4444
var closed = false
@@ -620,7 +620,7 @@ class SocketIOClient {
620620

621621
// Message is binary
622622
if let binary = message as? NSData {
623-
if self.lastSocketMessage == nil {
623+
if self.waitingData.isEmpty {
624624
return
625625
}
626626

@@ -667,7 +667,6 @@ class SocketIOClient {
667667
mutMessageObject = RegexMutable(binaryGroup[5])
668668

669669
if namespace == "" && self.nsp != nil {
670-
self.lastSocketMessage = nil
671670
return
672671
}
673672

@@ -684,7 +683,7 @@ class SocketIOClient {
684683
placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt())
685684
}
686685

687-
self.lastSocketMessage = mes
686+
self.waitingData.append(mes)
688687
} else if binaryGroup[1].hasPrefix("6") {
689688
let messageType = RegexMutable(binaryGroup[1])
690689
let numberOfPlaceholders = (messageType["6"] ~= "") as String
@@ -706,8 +705,10 @@ class SocketIOClient {
706705
let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"]
707706
~= "\"~~$2\""
708707

709-
self.lastSocketMessage = SocketEvent(event: "", args: placeholdersRemoved,
708+
let event = SocketEvent(event: "", args: placeholdersRemoved,
710709
placeholders: numberOfPlaceholders.toInt()!, ackNum: ackNum.toInt(), justAck: true)
710+
711+
self.waitingData.append(event)
711712
}
712713
/**
713714
End check for binary placeholders
@@ -717,41 +718,42 @@ class SocketIOClient {
717718

718719
// Handles binary data
719720
private func parseBinaryData(data:NSData) {
720-
let shouldExecute = self.lastSocketMessage?.addData(data)
721+
let shouldExecute = self.waitingData[0].addData(data)
721722

722-
if shouldExecute != nil && shouldExecute! {
723-
var event = self.lastSocketMessage!.event
724-
var parsedArgs:AnyObject? = SocketIOClient.parseData(self.lastSocketMessage!.args as? String)
723+
if shouldExecute {
724+
let socketEvent = self.waitingData.removeAtIndex(0)
725+
var event = socketEvent.event
726+
var parsedArgs:AnyObject? = SocketIOClient.parseData(socketEvent.args as? String)
725727

726728
if let args:AnyObject = parsedArgs {
727-
let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders(args)
729+
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders(args)
728730

729-
if self.lastSocketMessage!.justAck! {
731+
if socketEvent.justAck! {
730732
// Should handle ack
731-
self.handleAck(self.lastSocketMessage!.ack!, data: filledInArgs)
733+
self.handleAck(socketEvent.ack!, data: filledInArgs)
732734
return
733735
}
734736

735737
// Should do event
736-
if self.lastSocketMessage!.ack != nil {
738+
if socketEvent.ack != nil {
737739
self.handleEvent(event, data: filledInArgs, isInternalMessage: false,
738-
wantsAck: self.lastSocketMessage!.ack!, withAckType: 6)
740+
wantsAck: socketEvent.ack!, withAckType: 6)
739741
} else {
740742
self.handleEvent(event, data: filledInArgs)
741743
}
742744
} else {
743-
let filledInArgs:AnyObject = self.lastSocketMessage!.fillInPlaceholders()
745+
let filledInArgs:AnyObject = socketEvent.fillInPlaceholders()
744746

745747
// Should handle ack
746-
if self.lastSocketMessage!.justAck! {
747-
self.handleAck(self.lastSocketMessage!.ack!, data: filledInArgs)
748+
if socketEvent.justAck! {
749+
self.handleAck(socketEvent.ack!, data: filledInArgs)
748750
return
749751
}
750752

751753
// Should handle ack
752-
if self.lastSocketMessage!.ack != nil {
754+
if socketEvent.ack != nil {
753755
self.handleEvent(event, data: filledInArgs, isInternalMessage: false,
754-
wantsAck: self.lastSocketMessage!.ack!, withAckType: 6)
756+
wantsAck: socketEvent.ack!, withAckType: 6)
755757
} else {
756758
self.handleEvent(event, data: filledInArgs)
757759
}

0 commit comments

Comments
 (0)