diff --git a/Source/SocketIO/Client/SocketIOClientSpec.swift b/Source/SocketIO/Client/SocketIOClientSpec.swift index 629ee78..80e1e6a 100644 --- a/Source/SocketIO/Client/SocketIOClientSpec.swift +++ b/Source/SocketIO/Client/SocketIOClientSpec.swift @@ -344,4 +344,16 @@ public enum SocketClientEvent : String { /// } /// ``` case statusChange + + /// Emitted when when upgrading the http connection to a websocket connection. + /// + /// Usage: + /// + /// ```swift + /// socket.on(clientEvent: .websocketUpgrade) {data, ack in + /// let headers = (data as [Any])[0] + /// // Some header logic + /// } + /// ``` + case websocketUpgrade } diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index 1ed0b62..9466a9e 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -313,6 +313,12 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So this.parseEngineMessage(message) } + ws?.onHttpResponseHeaders = {[weak self] headers in + guard let this = self else { return } + + this.client?.engineDidWebsocketUpgrade(headers: headers) + } + ws?.connect() } @@ -666,7 +672,9 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So connected = false polling = true - if let reason = error?.localizedDescription { + if let error = error as? WSError { + didError(reason: "\(error.message). code=\(error.code), type=\(error.type)") + } else if let reason = error?.localizedDescription { didError(reason: reason) } else { client?.engineDidClose(reason: "Socket Disconnected") diff --git a/Source/SocketIO/Engine/SocketEngineClient.swift b/Source/SocketIO/Engine/SocketEngineClient.swift index eefc2ac..00d68fa 100644 --- a/Source/SocketIO/Engine/SocketEngineClient.swift +++ b/Source/SocketIO/Engine/SocketEngineClient.swift @@ -59,4 +59,9 @@ import Foundation /// /// - parameter data: The data the engine received. func parseEngineBinaryData(_ data: Data) + + /// Called when when upgrading the http connection to a websocket connection. + /// + /// - parameter headers: The http headers. + func engineDidWebsocketUpgrade(headers: [String: String]) } diff --git a/Source/SocketIO/Manager/SocketManager.swift b/Source/SocketIO/Manager/SocketManager.swift index fd47ead..19c6c9e 100644 --- a/Source/SocketIO/Manager/SocketManager.swift +++ b/Source/SocketIO/Manager/SocketManager.swift @@ -377,6 +377,18 @@ open class SocketManager : NSObject, SocketManagerSpec, SocketParsable, SocketDa } } + /// Called when when upgrading the http connection to a websocket connection. + /// + /// - parameter headers: The http headers. + open func engineDidWebsocketUpgrade(headers: [String: String]) { + handleQueue.async { + self._engineDidWebsocketUpgrade(headers: headers) + } + } + private func _engineDidWebsocketUpgrade(headers: [String: String]) { + emitAll(clientEvent: .websocketUpgrade, data: [headers]) + } + /// Called when the engine has a message that must be parsed. /// /// - parameter msg: The message that needs parsing.