diff --git a/CHANGELOG.md b/CHANGELOG.md index 7aa62bf..4f57fc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v15.1.0 + +- Add ability to enable websockets SOCKS proxy. +- Fix emit completion callback not firing on websockets [#1178](https://github.com/socketio/socket.io-client-swift/issues/1178) + # v15.0.0 - Swift 5 diff --git a/README.md b/README.md index 3cbb312..dd1004c 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Then import `import SocketIO`. ### Carthage Add this line to your `Cartfile`: ``` -github "socketio/socket.io-client-swift" ~> 15.0.0 +github "socketio/socket.io-client-swift" ~> 15.1.0 ``` Run `carthage update --platform ios,macosx`. @@ -113,7 +113,7 @@ Create `Podfile` and add `pod 'Socket.IO-Client-Swift'`: use_frameworks! target 'YourApp' do - pod 'Socket.IO-Client-Swift', '~> 15.0.0' + pod 'Socket.IO-Client-Swift', '~> 15.1.0' end ``` diff --git a/Source/SocketIO/Client/SocketIOClientOption.swift b/Source/SocketIO/Client/SocketIOClientOption.swift index 1d687e0..bda846d 100644 --- a/Source/SocketIO/Client/SocketIOClientOption.swift +++ b/Source/SocketIO/Client/SocketIOClientOption.swift @@ -52,6 +52,9 @@ public enum SocketIOClientOption : ClientOption { /// If passed `true`, the only transport that will be used will be WebSockets. case forceWebsockets(Bool) + + /// If passed `true`, the WebSocket stream will be configured with the enableSOCKSProxy `true`. + case enableSOCKSProxy(Bool) /// The queue that all interaction with the client should occur on. This is the queue that event handlers are /// called on. @@ -143,6 +146,8 @@ public enum SocketIOClientOption : ClientOption { description = "security" case .sessionDelegate: description = "sessionDelegate" + case .enableSOCKSProxy: + description = "enableSOCKSProxy" } return description @@ -192,6 +197,8 @@ public enum SocketIOClientOption : ClientOption { value = signed case let .sessionDelegate(delegate): value = delegate + case let .enableSOCKSProxy(enable): + value = enable } return value diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index 50839ad..b4af5f4 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -113,6 +113,9 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So /// If `true`, then the engine is currently in WebSockets mode. @available(*, deprecated, message: "No longer needed, if we're not polling, then we must be doing websockets") public private(set) var websocket = false + + /// When `true`, the WebSocket `stream` will be configured with the enableSOCKSProxy `true`. + public private(set) var enableSOCKSProxy = false /// The WebSocket for this engine. public private(set) var ws: WebSocket? @@ -283,7 +286,9 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So addHeaders(to: &req, includingCookies: session?.configuration.httpCookieStorage?.cookies(for: urlPollingWithSid)) - ws = WebSocket(request: req) + let stream = FoundationStream() + stream.enableSOCKSProxy = enableSOCKSProxy + ws = WebSocket(request: req, stream: stream) ws?.callbackQueue = engineQueue ws?.enableCompression = compress ws?.disableSSLCertValidation = selfSigned @@ -593,6 +598,8 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So self.security = security case .compress: self.compress = true + case .enableSOCKSProxy: + self.enableSOCKSProxy = true default: continue } diff --git a/Source/SocketIO/Engine/SocketEngineWebsocket.swift b/Source/SocketIO/Engine/SocketEngineWebsocket.swift index 0b85ce1..ea1c53f 100644 --- a/Source/SocketIO/Engine/SocketEngineWebsocket.swift +++ b/Source/SocketIO/Engine/SocketEngineWebsocket.swift @@ -62,15 +62,19 @@ extension SocketEngineWebsocket { /// - parameter completion: Callback called on transport write completion. public func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, - withData datas: [Data], + withData data: [Data], completion: (() -> ())? ) { DefaultSocketLogger.Logger.log("Sending ws: \(str) as type: \(type.rawValue)", type: "SocketEngineWebSocket") ws?.write(string: "\(type.rawValue)\(str)") - for data in datas { - if case let .left(bin) = createBinaryDataForSend(using: data) { + if data.count == 0 { + completion?() + } + + for item in data { + if case let .left(bin) = createBinaryDataForSend(using: item) { ws?.write(data: bin, completion: completion) } } diff --git a/Source/SocketIO/Util/SocketExtensions.swift b/Source/SocketIO/Util/SocketExtensions.swift index 4636327..8545132 100644 --- a/Source/SocketIO/Util/SocketExtensions.swift +++ b/Source/SocketIO/Util/SocketExtensions.swift @@ -85,6 +85,8 @@ extension Dictionary where Key == String, Value == Any { return .sessionDelegate(delegate) case let ("compress", compress as Bool): return compress ? .compress : nil + case let ("enableSOCKSProxy", enable as Bool): + return .enableSOCKSProxy(enable) default: return nil }