9
9
// - https://raw.githubusercontent.com/daltoniam/Starscream/swift-23/Source/WebSocket.swift
10
10
// (with trivial warnings fixed, trailing spaces removed, and some access levels changed)
11
11
//
12
- // commit SHA 60b27a438
13
-
12
+ // commit SHA ee993322c
14
13
15
14
//////////////////////////////////////////////////////////////////////////////////////////////////
16
15
//
@@ -273,6 +272,7 @@ open class SSLSecurity : SSLTrustValidator {
273
272
274
273
}
275
274
275
+
276
276
//////////////////////////////////////////////////////////////////////////////////////////////////
277
277
//
278
278
// Websocket.swift
@@ -436,7 +436,7 @@ open class WebSocket : NSObject, StreamDelegate {
436
436
return canWork
437
437
}
438
438
/// 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: [ ] )
440
440
441
441
/// Used for setting protocols.
442
442
public init ( url: URL , protocols: [ String ] ? = nil ) {
@@ -533,7 +533,6 @@ open class WebSocket : NSObject, StreamDelegate {
533
533
Private method that starts the connection.
534
534
*/
535
535
private func createHTTPRequest( ) {
536
-
537
536
let urlRequest = CFHTTPMessageCreateRequest ( kCFAllocatorDefault, " GET " as CFString ,
538
537
url as CFURL , kCFHTTPVersion1_1) . takeRetainedValue ( )
539
538
@@ -607,6 +606,7 @@ open class WebSocket : NSObject, StreamDelegate {
607
606
inStream. delegate = self
608
607
outStream. delegate = self
609
608
if supportedSSLSchemes. contains ( url. scheme!) {
609
+ certValidated = false
610
610
inStream. setProperty ( StreamSocketSecurityLevel . negotiatedSSL as AnyObject , forKey: Stream . PropertyKey. socketSecurityLevelKey)
611
611
outStream. setProperty ( StreamSocketSecurityLevel . negotiatedSSL as AnyObject , forKey: Stream . PropertyKey. socketSecurityLevelKey)
612
612
if disableSSLCertValidation {
@@ -658,14 +658,29 @@ open class WebSocket : NSObject, StreamDelegate {
658
658
guard !sOperation. isCancelled else { return }
659
659
out -= 100
660
660
if out < 0 {
661
- self ? . cleanupStream ( )
661
+ WebSocket . sharedWorkQueue. async {
662
+ self ? . cleanupStream ( )
663
+ }
662
664
self ? . doDisconnect ( self ? . errorWithDetail ( " write wait timed out " , code: 2 ) )
663
665
return
664
666
} else if outStream. streamError != nil {
665
667
return // disconnectStream will be called.
666
668
}
667
669
}
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
+ }
669
684
outStream. write ( bytes, maxLength: data. count)
670
685
}
671
686
writeQueue. addOperation ( operation)
@@ -675,17 +690,6 @@ open class WebSocket : NSObject, StreamDelegate {
675
690
Delegate for the stream methods. Processes incoming bytes
676
691
*/
677
692
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
- }
689
693
if eventCode == . hasBytesAvailable {
690
694
if aStream == inputStream {
691
695
processInputStream ( )
@@ -916,7 +920,8 @@ open class WebSocket : NSObject, StreamDelegate {
916
920
return buffer. fromOffset ( bufferLen - extra)
917
921
} else {
918
922
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)
920
925
let isMasked = ( MaskMask & baseAddress [ 1 ] )
921
926
let payloadLen = ( PayloadLenMask & baseAddress [ 1 ] )
922
927
var offset = 2
@@ -930,7 +935,7 @@ open class WebSocket : NSObject, StreamDelegate {
930
935
if !isControlFrame && ( receivedOpcode != . binaryFrame && receivedOpcode != . continueFrame &&
931
936
receivedOpcode != . textFrame && receivedOpcode != . pong) {
932
937
let errCode = CloseCode . protocolError. rawValue
933
- doDisconnect ( errorWithDetail ( " unknown opcode: \( receivedOpcode ) " , code: errCode) )
938
+ doDisconnect ( errorWithDetail ( " unknown opcode: \( receivedOpcodeRawValue ) " , code: errCode) )
934
939
writeError ( errCode)
935
940
return emptyBuffer
936
941
}
@@ -975,18 +980,13 @@ open class WebSocket : NSObject, StreamDelegate {
975
980
if dataLength > UInt64 ( bufferLen) {
976
981
len = UInt64 ( bufferLen- offset)
977
982
}
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)
989
987
}
988
+ let data = Data ( bytes: baseAddress+ offset, count: Int ( len) )
989
+
990
990
if receivedOpcode == . connectionClose {
991
991
var closeReason = " connection closed by server "
992
992
if let customCloseReason = String ( data: data, encoding: . utf8) {
@@ -1220,6 +1220,7 @@ open class WebSocket : NSObject, StreamDelegate {
1220
1220
readyToWrite = false
1221
1221
mutex. unlock ( )
1222
1222
cleanupStream ( )
1223
+ writeQueue. cancelAllOperations ( )
1223
1224
}
1224
1225
1225
1226
}
0 commit comments