Skip to content

Commit 332ff6f

Browse files
committed
handle error message
1 parent 7adf624 commit 332ff6f

File tree

4 files changed

+71
-61
lines changed

4 files changed

+71
-61
lines changed

SwiftIO/SocketEngine.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
349349

350350
public func open(opts:[String: AnyObject]? = nil) {
351351
if self.connected {
352-
self.client?.engineDidError("Engine tried to open while connected")
352+
self.client?.didError("Engine tried to open while connected")
353353
return
354354
}
355355

@@ -478,9 +478,8 @@ public class SocketEngine: NSObject, WebSocketDelegate {
478478
message.removeAtIndex(message.startIndex)
479479
let mesData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
480480

481-
if let json = NSJSONSerialization.JSONObjectWithData(mesData,
482-
options: NSJSONReadingOptions.AllowFragments, error: &err) as? NSDictionary,
483-
let sid = json["sid"] as? String {
481+
if let json = NSJSONSerialization.JSONObjectWithData(mesData, options: NSJSONReadingOptions.AllowFragments,
482+
error: &err) as? NSDictionary, let sid = json["sid"] as? String {
484483
self.sid = sid
485484
self._connected = true
486485

@@ -492,7 +491,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
492491
self.pingInterval = pingInterval / 1000
493492
}
494493
} else {
495-
self.client?.engineDidError("Engine failed to handshake")
494+
self.client?.didError("Engine failed to handshake")
496495
return
497496
}
498497

SwiftIO/SocketEngineClient.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import Foundation
3232
var socketURL:String {get}
3333
var secure:Bool {get}
3434

35-
func engineDidError(reason:String)
35+
func didError(reason:AnyObject)
3636
func engineDidForceClose(reason:String)
3737
func parseSocketMessage(msg:String)
3838
func parseBinaryData(data:NSData)

SwiftIO/SocketIOClient.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,15 @@ public class SocketIOClient: NSObject, SocketEngineClient {
226226
self.handleEvent("connect", data: nil, isInternalMessage: false)
227227
}
228228

229+
/// error
230+
public func didError(reason:AnyObject) {
231+
if !(reason is [AnyObject]) {
232+
self.handleEvent("error", data: [reason], isInternalMessage: true)
233+
} else {
234+
self.handleEvent("error", data: reason as? [AnyObject], isInternalMessage: true)
235+
}
236+
}
237+
229238
/**
230239
Same as close
231240
*/
@@ -321,11 +330,6 @@ public class SocketIOClient: NSObject, SocketEngineClient {
321330
}
322331
}
323332

324-
/// Engine error
325-
public func engineDidError(reason:String) {
326-
self.handleEvent("error", data: [reason], isInternalMessage: true)
327-
}
328-
329333
/// Server wants us to die
330334
public func engineDidForceClose(reason:String) {
331335
if self.closed {

SwiftIO/SocketParser.swift

Lines changed: 57 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -24,46 +24,46 @@ import Foundation
2424

2525
class SocketParser {
2626
private static let shredder = SocketParser.PacketShredder()
27-
27+
2828
// Translation of socket.io-parser#deconstructPacket
2929
private class PacketShredder {
3030
var buf = ContiguousArray<NSData>()
31-
31+
3232
func shred(data:AnyObject) -> AnyObject {
3333
if let bin = data as? NSData {
3434
let placeholder = ["_placeholder" :true, "num": buf.count]
35-
35+
3636
buf.append(bin)
37-
37+
3838
return placeholder
3939
} else if let arr = data as? NSArray {
4040
var newArr = NSMutableArray(array: arr)
41-
41+
4242
for i in 0..<arr.count {
4343
newArr[i] = shred(arr[i])
4444
}
45-
45+
4646
return newArr
4747
} else if let dict = data as? NSDictionary {
4848
var newDict = NSMutableDictionary(dictionary: dict)
49-
49+
5050
for (key, value) in newDict {
5151
newDict[key as! NSCopying] = shred(value)
5252
}
53-
53+
5454
return newDict
5555
} else {
5656
return data
5757
}
5858
}
59-
59+
6060
func deconstructPacket(packet:SocketPacket) {
6161
if packet.data == nil {
6262
return
6363
}
64-
64+
6565
var data = packet.data!
66-
66+
6767
for i in 0..<data.count {
6868
if data[i] is NSArray || data[i] is NSDictionary {
6969
data[i] = shred(data[i])
@@ -72,64 +72,64 @@ class SocketParser {
7272
buf.append(bin)
7373
}
7474
}
75-
75+
7676
packet.data = data
7777
packet.binary = buf
7878
buf.removeAll(keepCapacity: true)
7979
}
8080
}
81-
81+
8282
// Translation of socket.io-client#decodeString
8383
static func parseString(str:String) -> SocketPacket? {
8484
let arr = Array(str)
8585
let type = String(arr[0])
86-
86+
8787
if arr.count == 1 {
8888
return SocketPacket(type: SocketPacketType(str: type))
8989
}
90-
90+
9191
var id = nil as Int?
9292
var nsp = ""
9393
var i = 0
9494
var placeholders = -1
95-
95+
9696
if type == "5" || type == "6" {
9797
var buf = ""
98-
98+
9999
while arr[++i] != "-" {
100100
buf += String(arr[i])
101101
if i == arr.count {
102102
break
103103
}
104104
}
105-
105+
106106
if buf.toInt() == nil || arr[i] != "-" {
107107
NSLog("Error parsing \(str)")
108108
return nil
109109
} else {
110110
placeholders = buf.toInt()!
111111
}
112112
}
113-
113+
114114
if arr[i + 1] == "/" {
115115
while ++i < arr.count {
116116
let c = arr[i]
117-
117+
118118
if c == "," {
119119
break
120120
}
121-
121+
122122
nsp += String(c)
123123
}
124124
}
125-
125+
126126
if i + 1 >= arr.count {
127127
return SocketPacket(type: SocketPacketType(str: type),
128128
nsp: nsp, placeholders: placeholders, id: id)
129129
}
130-
130+
131131
let next = String(arr[i + 1])
132-
132+
133133
if next.toInt() != nil {
134134
var c = ""
135135
while ++i < arr.count {
@@ -140,78 +140,83 @@ class SocketParser {
140140
break
141141
}
142142
}
143-
143+
144144
id = c.toInt()
145145
}
146-
147-
if i + 1 < arr.count {
148-
let d = String(arr[++i...arr.count-1])
146+
147+
if ++i < arr.count {
148+
let d = String(arr[i...arr.count-1])
149149
let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\""
150-
151-
let data = SocketParser.parseData(noPlaceholders) as! [AnyObject]
152-
150+
let data:[AnyObject]
151+
152+
if let isArr = SocketParser.parseData(noPlaceholders) as? [AnyObject] {
153+
data = isArr
154+
} else {
155+
data = [noPlaceholders]
156+
}
157+
153158
return SocketPacket(type: SocketPacketType(str: type), data: data,
154159
nsp: nsp, placeholders: placeholders, id: id)
155160
}
156-
161+
157162
return nil
158163
}
159-
164+
160165
// Parses data for events
161166
static func parseData(data:String) -> AnyObject? {
162167
var err:NSError?
163168
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
164169
let parsed:AnyObject? = NSJSONSerialization.JSONObjectWithData(stringData!,
165170
options: NSJSONReadingOptions.AllowFragments, error: &err)
166-
171+
167172
if err != nil {
168173
// println(err)
169174
return nil
170175
}
171-
176+
172177
return parsed
173178
}
174-
179+
175180
static func parseForEmit(packet:SocketPacket) {
176181
shredder.deconstructPacket(packet)
177182
}
178-
183+
179184
// Parses messages recieved
180185
static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) {
181186
if stringMessage == "" {
182187
return
183188
}
184-
189+
185190
func checkNSP(nsp:String) -> Bool {
186191
return nsp == "" && socket.nsp != "/"
187192
}
188-
193+
189194
let p = parseString(stringMessage) as SocketPacket!
190-
195+
191196
if p.type == SocketPacketType.EVENT {
192197
if checkNSP(p.nsp) {
193198
return
194199
}
195-
200+
196201
socket.handleEvent(p.getEvent(), data: p.data,
197202
isInternalMessage: false, wantsAck: p.id)
198203
} else if p.type == SocketPacketType.ACK {
199204
if checkNSP(p.nsp) {
200205
return
201206
}
202-
207+
203208
socket.handleAck(p.id!, data: p.data)
204209
} else if p.type == SocketPacketType.BINARY_EVENT {
205210
if checkNSP(p.nsp) {
206211
return
207212
}
208-
213+
209214
socket.waitingData.append(p)
210215
} else if p.type == SocketPacketType.BINARY_ACK {
211216
if checkNSP(p.nsp) {
212217
return
213218
}
214-
219+
215220
p.justAck = true
216221
socket.waitingData.append(p)
217222
} else if p.type == SocketPacketType.CONNECT {
@@ -224,27 +229,29 @@ class SocketParser {
224229
}
225230
} else if p.type == SocketPacketType.DISCONNECT {
226231
socket.engineDidForceClose("Got Disconnect")
232+
} else if p.type == SocketPacketType.ERROR {
233+
socket.didError(p.data == nil ? "Error" : p.data!)
227234
}
228235
}
229-
236+
230237
// Handles binary data
231238
static func parseBinaryData(data:NSData, socket:SocketIOClient) {
232239
// NSLog(data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros))
233-
240+
234241
if socket.waitingData.count == 0 {
235242
NSLog("Got data when not remaking packet")
236243
return
237244
}
238-
245+
239246
let shouldExecute = socket.waitingData[0].addData(data)
240-
247+
241248
if !shouldExecute {
242249
return
243250
}
244-
251+
245252
let packet = socket.waitingData.removeAtIndex(0)
246253
packet.fillInPlaceholders()
247-
254+
248255
if !packet.justAck {
249256
socket.handleEvent(packet.getEvent(), data: packet.data,
250257
wantsAck: packet.id)

0 commit comments

Comments
 (0)