Skip to content

Commit 5ed2688

Browse files
committed
better handle when the server closes the connection (polling)
1 parent 296802f commit 5ed2688

File tree

2 files changed

+45
-32
lines changed

2 files changed

+45
-32
lines changed

SwiftIO/SocketEngine.swift

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
8585
} else {
8686
self.client.didForceClose()
8787
}
88-
89-
if self.polling {
90-
self.client.handleEvent("disconnect", data: "close", isInternalMessage: true)
91-
}
9288
}
9389

9490
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) {
@@ -147,9 +143,8 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
147143
return
148144
}
149145

150-
let time = Int(NSDate().timeIntervalSince1970)
151146
let req = NSURLRequest(URL:
152-
NSURL(string: self.urlPolling! + "&t=\(time)-0&b64=1" + "&sid=\(self.sid)")!)
147+
NSURL(string: self.urlPolling! + "&sid=\(self.sid)")!)
153148
self.wait = true
154149

155150
NSURLConnection.sendAsynchronousRequest(req,
@@ -248,13 +243,38 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
248243
}
249244
}
250245

251-
// A poll failed, try and reconnect
246+
// A poll failed, tell the client about it
247+
// We check to see if we were closed by the server first
252248
private func handlePollingFailed() {
253249
if !self.client.reconnecting {
254250
self.pingTimer?.invalidate()
255251
self.wait = false
256-
self.client.handleEvent("reconnect", data: "XHR polling timeout", isInternalMessage: true)
257-
self.client.tryReconnect(triesLeft: self.client.reconnectAttempts)
252+
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+
}
258278
}
259279
}
260280

SwiftIO/SocketIOClient.swift

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,17 @@ class SocketIOClient {
119119
self.connected = true
120120
self.connecting = false
121121
self.reconnecting = false
122+
self.handleEvent("connect", data: nil, isInternalMessage: false)
122123
}
123124

124125
// Server wants us to die
125126
func didForceClose() {
126127
self.closed = true
127-
self.connecting = false
128128
self.connected = false
129+
self.reconnects = false
130+
self.connecting = false
129131
self.reconnecting = false
132+
self.handleEvent("disconnect", data: "closed", isInternalMessage: true)
130133
}
131134

132135
// Sends a message with multiple args
@@ -489,7 +492,6 @@ class SocketIOClient {
489492
if self.nsp != nil {
490493
if stringMessage == "0/\(self.nsp!)" {
491494
self.didConnect()
492-
self.handleEvent("connect", data: nil)
493495
return
494496
}
495497
}
@@ -503,7 +505,6 @@ class SocketIOClient {
503505
// Don't handle as internal because something crazy could happen where
504506
// we disconnect before it's handled
505507
self.didConnect()
506-
self.handleEvent("connect", data: nil)
507508
return
508509
}
509510
}
@@ -758,16 +759,20 @@ class SocketIOClient {
758759
}
759760
}
760761

762+
// Something happened while polling
763+
func pollingDidFail() {
764+
if !self.reconnecting {
765+
self.handleEvent("reconnect", data: "XHR polling error", isInternalMessage: true)
766+
self.tryReconnect(triesLeft: self.reconnectAttempts)
767+
}
768+
}
769+
761770
// We lost connection and should attempt to reestablish
762771
func tryReconnect(var #triesLeft:Int) {
763772
self.connected = false
764773

765774
if triesLeft != -1 && triesLeft <= 0 {
766-
self.connected = false
767-
self.connecting = false
768-
self.reconnects = false
769-
self.reconnecting = false
770-
self.handleEvent("disconnect", data: "Failed to reconnect", isInternalMessage: true)
775+
self.didForceClose()
771776
return
772777
} else if self.connected {
773778
self.connecting = false
@@ -776,7 +781,7 @@ class SocketIOClient {
776781
}
777782

778783
// println("Trying to reconnect #\(reconnectAttempts - triesLeft)")
779-
self.handleEvent("reconnectAttempt", data: triesLeft, isInternalMessage: true)
784+
self.handleEvent("reconnectAttempt", data: triesLeft - 1, isInternalMessage: true)
780785

781786
let waitTime = UInt64(self.reconnectWait) * NSEC_PER_SEC
782787
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(waitTime))
@@ -802,27 +807,15 @@ class SocketIOClient {
802807
}
803808
}
804809

805-
// Called when a message is recieved
806-
func webSocket(webSocket:SRWebSocket!, didReceiveMessage message:AnyObject?) {
807-
dispatch_async(self.handleQueue) {[weak self] in
808-
if self == nil {
809-
return
810-
}
811-
812-
self?.parseSocketMessage(message)
813-
}
814-
}
815-
816810
// Called when the socket is closed
817811
func webSocketDidCloseWithCode(code:Int, reason:String!, wasClean:Bool) {
818812
self.connected = false
819813
self.connecting = false
820814
if self.closed || !self.reconnects {
821-
self.handleEvent("disconnect", data: reason, isInternalMessage: true)
815+
self.didForceClose()
822816
} else {
823817
self.handleEvent("reconnect", data: reason, isInternalMessage: true)
824818
self.tryReconnect(triesLeft: self.reconnectAttempts)
825-
826819
}
827820
}
828821

@@ -832,7 +825,7 @@ class SocketIOClient {
832825
self.connecting = false
833826
self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true)
834827
if self.closed || !self.reconnects {
835-
self.handleEvent("disconnect", data: error.localizedDescription, isInternalMessage: true)
828+
self.didForceClose()
836829
} else if !self.reconnecting {
837830
self.handleEvent("reconnect", data: error.localizedDescription, isInternalMessage: true)
838831
self.tryReconnect(triesLeft: self.reconnectAttempts)

0 commit comments

Comments
 (0)