Skip to content

Commit 88c0b6d

Browse files
committed
Update Starscream to commit ee993322c
1 parent f3932a0 commit 88c0b6d

File tree

1 file changed

+31
-30
lines changed

1 file changed

+31
-30
lines changed

Source/Starscream.swift

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
// - https://raw.githubusercontent.com/daltoniam/Starscream/swift-23/Source/WebSocket.swift
1010
// (with trivial warnings fixed, trailing spaces removed, and some access levels changed)
1111
//
12-
// commit SHA 60b27a438
13-
12+
// commit SHA ee993322c
1413

1514
//////////////////////////////////////////////////////////////////////////////////////////////////
1615
//
@@ -273,6 +272,7 @@ open class SSLSecurity : SSLTrustValidator {
273272

274273
}
275274

275+
276276
//////////////////////////////////////////////////////////////////////////////////////////////////
277277
//
278278
// Websocket.swift
@@ -436,7 +436,7 @@ open class WebSocket : NSObject, StreamDelegate {
436436
return canWork
437437
}
438438
/// The shared processing queue used for all WebSocket.
439-
private static let sharedWorkQueue = DispatchQueue(label: "com.vluxe.starscream.websocket.pusher", attributes: [])
439+
private static let sharedWorkQueue = DispatchQueue(label: "com.vluxe.starscream.websocket", attributes: [])
440440

441441
/// Used for setting protocols.
442442
public init(url: URL, protocols: [String]? = nil) {
@@ -533,7 +533,6 @@ open class WebSocket : NSObject, StreamDelegate {
533533
Private method that starts the connection.
534534
*/
535535
private func createHTTPRequest() {
536-
537536
let urlRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET" as CFString,
538537
url as CFURL, kCFHTTPVersion1_1).takeRetainedValue()
539538

@@ -607,6 +606,7 @@ open class WebSocket : NSObject, StreamDelegate {
607606
inStream.delegate = self
608607
outStream.delegate = self
609608
if supportedSSLSchemes.contains(url.scheme!) {
609+
certValidated = false
610610
inStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as AnyObject, forKey: Stream.PropertyKey.socketSecurityLevelKey)
611611
outStream.setProperty(StreamSocketSecurityLevel.negotiatedSSL as AnyObject, forKey: Stream.PropertyKey.socketSecurityLevelKey)
612612
if disableSSLCertValidation {
@@ -658,14 +658,29 @@ open class WebSocket : NSObject, StreamDelegate {
658658
guard !sOperation.isCancelled else { return }
659659
out -= 100
660660
if out < 0 {
661-
self?.cleanupStream()
661+
WebSocket.sharedWorkQueue.async {
662+
self?.cleanupStream()
663+
}
662664
self?.doDisconnect(self?.errorWithDetail("write wait timed out", code: 2))
663665
return
664666
} else if outStream.streamError != nil {
665667
return // disconnectStream will be called.
666668
}
667669
}
668-
guard !sOperation.isCancelled else { return }
670+
guard !sOperation.isCancelled, let s = self else { return }
671+
// Do the pinning now if needed
672+
if let sec = s.security, !s.certValidated {
673+
let trust = outStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) as! SecTrust
674+
let domain = outStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String
675+
s.certValidated = sec.isValid(trust, domain: domain)
676+
if !s.certValidated {
677+
WebSocket.sharedWorkQueue.async {
678+
let error = s.errorWithDetail("Invalid SSL certificate", code: 1)
679+
s.disconnectStream(error)
680+
}
681+
return
682+
}
683+
}
669684
outStream.write(bytes, maxLength: data.count)
670685
}
671686
writeQueue.addOperation(operation)
@@ -675,17 +690,6 @@ open class WebSocket : NSObject, StreamDelegate {
675690
Delegate for the stream methods. Processes incoming bytes
676691
*/
677692
open func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
678-
if let sec = security, !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) {
679-
let trust = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) as! SecTrust
680-
let domain = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) as? String
681-
if sec.isValid(trust, domain: domain) {
682-
certValidated = true
683-
} else {
684-
let error = errorWithDetail("Invalid SSL certificate", code: 1)
685-
disconnectStream(error)
686-
return
687-
}
688-
}
689693
if eventCode == .hasBytesAvailable {
690694
if aStream == inputStream {
691695
processInputStream()
@@ -916,7 +920,8 @@ open class WebSocket : NSObject, StreamDelegate {
916920
return buffer.fromOffset(bufferLen - extra)
917921
} else {
918922
let isFin = (FinMask & baseAddress[0])
919-
let receivedOpcode = OpCode(rawValue: (OpCodeMask & baseAddress[0]))
923+
let receivedOpcodeRawValue = (OpCodeMask & baseAddress[0])
924+
let receivedOpcode = OpCode(rawValue: receivedOpcodeRawValue)
920925
let isMasked = (MaskMask & baseAddress[1])
921926
let payloadLen = (PayloadLenMask & baseAddress[1])
922927
var offset = 2
@@ -930,7 +935,7 @@ open class WebSocket : NSObject, StreamDelegate {
930935
if !isControlFrame && (receivedOpcode != .binaryFrame && receivedOpcode != .continueFrame &&
931936
receivedOpcode != .textFrame && receivedOpcode != .pong) {
932937
let errCode = CloseCode.protocolError.rawValue
933-
doDisconnect(errorWithDetail("unknown opcode: \(receivedOpcode)", code: errCode))
938+
doDisconnect(errorWithDetail("unknown opcode: \(receivedOpcodeRawValue)", code: errCode))
934939
writeError(errCode)
935940
return emptyBuffer
936941
}
@@ -975,18 +980,13 @@ open class WebSocket : NSObject, StreamDelegate {
975980
if dataLength > UInt64(bufferLen) {
976981
len = UInt64(bufferLen-offset)
977982
}
978-
let data: Data
979-
if len < 0 {
980-
len = 0
981-
data = Data()
982-
} else {
983-
if receivedOpcode == .connectionClose && len > 0 {
984-
let size = MemoryLayout<UInt16>.size
985-
offset += size
986-
len -= UInt64(size)
987-
}
988-
data = Data(bytes: baseAddress+offset, count: Int(len))
983+
if receivedOpcode == .connectionClose && len > 0 {
984+
let size = MemoryLayout<UInt16>.size
985+
offset += size
986+
len -= UInt64(size)
989987
}
988+
let data = Data(bytes: baseAddress+offset, count: Int(len))
989+
990990
if receivedOpcode == .connectionClose {
991991
var closeReason = "connection closed by server"
992992
if let customCloseReason = String(data: data, encoding: .utf8) {
@@ -1220,6 +1220,7 @@ open class WebSocket : NSObject, StreamDelegate {
12201220
readyToWrite = false
12211221
mutex.unlock()
12221222
cleanupStream()
1223+
writeQueue.cancelAllOperations()
12231224
}
12241225

12251226
}

0 commit comments

Comments
 (0)