Merge pull request #167 from hankbao/swift-2-fix-use-after-release

Fix use-after-release issue in WebSocket
This commit is contained in:
Erik Little 2015-09-09 11:44:05 -04:00
commit 259e543ad5

View File

@ -133,12 +133,19 @@ public class WebSocket : NSObject, NSStreamDelegate {
if isCreated { if isCreated {
return return
} }
unowned let weakSelf = self
dispatch_async(queue, { [weak self] in
dispatch_async(queue,{ guard let weakSelf = self else {
return
}
weakSelf.didDisconnect = false weakSelf.didDisconnect = false
}) })
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { [weak self] in
guard let weakSelf = self else {
return
}
weakSelf.isCreated = true weakSelf.isCreated = true
weakSelf.createHTTPRequest() weakSelf.createHTTPRequest()
weakSelf.isCreated = false weakSelf.isCreated = false
@ -370,14 +377,17 @@ public class WebSocket : NSObject, NSStreamDelegate {
} }
} }
if totalSize > 0 { if totalSize > 0 {
unowned let weakSelf = self
if validateResponse(buffer, bufferLen: totalSize) { if validateResponse(buffer, bufferLen: totalSize) {
dispatch_async(queue,{ dispatch_async(queue, { [weak self] in
guard let weakSelf = self else {
return
}
weakSelf.connected = true weakSelf.connected = true
if let connectBlock = weakSelf.onConnect { if let connectBlock = weakSelf.onConnect {
connectBlock() connectBlock()
} }
weakSelf.delegate?.websocketDidConnect(self) weakSelf.delegate?.websocketDidConnect(weakSelf)
}) })
totalSize += 1 //skip the last \n totalSize += 1 //skip the last \n
let restSize = bufferLen - totalSize let restSize = bufferLen - totalSize
@ -515,11 +525,15 @@ public class WebSocket : NSObject, NSStreamDelegate {
data = NSData(bytes: UnsafePointer<UInt8>((buffer+offset)), length: Int(len)) data = NSData(bytes: UnsafePointer<UInt8>((buffer+offset)), length: Int(len))
} }
if receivedOpcode == OpCode.Pong.rawValue { if receivedOpcode == OpCode.Pong.rawValue {
dispatch_async(queue,{[unowned self] in dispatch_async(queue, { [weak self] in
if let pongBlock = self.onPong { guard let weakSelf = self else {
return
}
if let pongBlock = weakSelf.onPong {
pongBlock() pongBlock()
} }
self.pongDelegate?.websocketDidReceivePong(self) weakSelf.pongDelegate?.websocketDidReceivePong(weakSelf)
}) })
let step = Int(offset+numericCast(len)) let step = Int(offset+numericCast(len))
@ -608,19 +622,27 @@ public class WebSocket : NSObject, NSStreamDelegate {
writeError(CloseCode.Encoding.rawValue) writeError(CloseCode.Encoding.rawValue)
return false return false
} }
dispatch_async(queue,{[unowned self] in dispatch_async(queue, { [weak self] in
if let textBlock = self.onText { guard let weakSelf = self else {
return
}
if let textBlock = weakSelf.onText {
textBlock(str! as String) textBlock(str! as String)
} }
self.delegate?.websocketDidReceiveMessage(self, text: str! as String) weakSelf.delegate?.websocketDidReceiveMessage(weakSelf, text: str! as String)
}) })
} else if response.code == .BinaryFrame { } else if response.code == .BinaryFrame {
let data = response.buffer! //local copy so it is perverse for writing let data = response.buffer! //local copy so it is perverse for writing
dispatch_async(queue,{[unowned self] in dispatch_async(queue, { [weak self] in
if let dataBlock = self.onData { guard let weakSelf = self else {
return
}
if let dataBlock = weakSelf.onData {
dataBlock(data) dataBlock(data)
} }
self.delegate?.websocketDidReceiveData(self, data: data) weakSelf.delegate?.websocketDidReceiveData(weakSelf, data: data)
}) })
} }
readStack.removeLast() readStack.removeLast()
@ -723,12 +745,16 @@ public class WebSocket : NSObject, NSStreamDelegate {
///used to preform the disconnect delegate ///used to preform the disconnect delegate
private func doDisconnect(error: NSError?) { private func doDisconnect(error: NSError?) {
if !self.didDisconnect { if !self.didDisconnect {
dispatch_async(queue,{[unowned self] in dispatch_async(queue, { [weak self] in
self.didDisconnect = true guard let weakSelf = self else {
if let disconnect = self.onDisconnect { return
}
weakSelf.didDisconnect = true
if let disconnect = weakSelf.onDisconnect {
disconnect(error) disconnect(error)
} }
self.delegate?.websocketDidDisconnect(self, error: error) weakSelf.delegate?.websocketDidDisconnect(weakSelf, error: error)
}) })
} }
} }