From c9ac69f4085f896f8589ff58561c19397025fb6b Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 14:55:58 -0500 Subject: [PATCH] first pass at socketio/socket.io-client-swift#288 --- SocketIO-MacTests/SocketEngineTest.swift | 4 +- SocketIO-MacTests/SocketParserTest.swift | 2 +- SocketIO-MacTests/SocketSideEffectTest.swift | 2 +- Source/SocketEngine.swift | 36 +++++++++++---- Source/SocketEngineSpec.swift | 2 +- Source/SocketIOClient.swift | 46 +++++++++++--------- 6 files changed, 59 insertions(+), 33 deletions(-) diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 4572a0f..317281e 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -15,8 +15,8 @@ class SocketEngineTest: XCTestCase { override func setUp() { super.setUp() - client = SocketIOClient(socketURL: "") - engine = SocketEngine(client: client, url: "", options: nil) + client = SocketIOClient(socketURL: NSURL()) + engine = SocketEngine(client: client, url: NSURL(), options: nil) client.setTestable() } diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index 9c24913..d17bb44 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import SocketIOClientSwift class SocketParserTest: XCTestCase { - let testSocket = SocketIOClient(socketURL: "") + let testSocket = SocketIOClient(socketURL: NSURL()) //Format key: message; namespace-data-binary-id static let packetTypes: Dictionary = [ diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index e703335..4580259 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -16,7 +16,7 @@ class SocketSideEffectTest: XCTestCase { override func setUp() { super.setUp() - socket = SocketIOClient(socketURL: "") + socket = SocketIOClient(socketURL: NSURL()) socket.setTestable() } diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 761ff12..15bb6d4 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -61,7 +61,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet private let logType = "SocketEngine" - private let url: String + private let url: NSURL private var connectParams: [String: AnyObject]? private var pingInterval: Double? @@ -76,11 +76,11 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb private var secure = false private var selfSigned = false private var voipEnabled = false - - public init(client: SocketEngineClient, url: String, options: Set) { + + public init(client: SocketEngineClient, url: NSURL, options: Set) { self.client = client self.url = url - + for option in options { switch option { case let .SessionDelegate(delegate): @@ -107,9 +107,20 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - public convenience init(client: SocketEngineClient, url: String, options: NSDictionary?) { - self.init(client: client, url: url, - options: options?.toSocketOptionsSet() ?? []) + public convenience init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) { + self.init(client: client, url: url, options: options?.toSocketOptionsSet() ?? []) + } + + @available(*, deprecated=5.3) + public convenience init(client: SocketEngineClient, urlString: String, options: Set) { + guard let url = NSURL(string: urlString) else { fatalError("Incorrect url") } + self.init(client: client, url: url, options: options) + } + + @available(*, deprecated=5.3) + public convenience init(client: SocketEngineClient, urlString: String, options: NSDictionary?) { + guard let url = NSURL(string: urlString) else { fatalError("Incorrect url") } + self.init(client: client, url: url, options: options?.toSocketOptionsSet() ?? []) } deinit { @@ -193,7 +204,16 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb return ("", "") } - let socketURL = "\(url)\(socketPath)/?transport=" + let absURL = url.absoluteString["https?://"] <~ "" + let baseURL: String + + if absURL.hasSuffix("/") { + baseURL = String(absURL.characters.dropLast()) + } else { + baseURL = absURL + } + + let socketURL = "\(baseURL)\(socketPath)/?transport=" var urlPolling: String var urlWebSocket: String diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 5a40a2e..64cd6e1 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -46,7 +46,7 @@ import Foundation var urlWebSocket: String { get } var websocket: Bool { get } - init(client: SocketEngineClient, url: String, options: NSDictionary?) + init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) func close(reason: String) func didError(error: String) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 21b619d..218c8ca 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable { - public let socketURL: String + public let socketURL: NSURL public private(set) var engine: SocketEngineSpec? public private(set) var status = SocketIOClientStatus.NotConnected @@ -55,25 +55,18 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable private(set) var reconnectAttempts = -1 var waitingData = [SocketPacket]() - + /** Type safe way to create a new SocketIOClient. opts can be omitted */ - public init(socketURL: String, options: Set = []) { + public init(socketURL: NSURL, options: Set = []) { self.options = options - - if socketURL.hasPrefix("https://") { + self.socketURL = socketURL + + if socketURL.absoluteString.hasPrefix("https://") { self.options.insertIgnore(.Secure(true)) } - var cleanedURL = socketURL["https?://"] <~ "" - - if cleanedURL.hasSuffix("/") { - cleanedURL = String(cleanedURL.characters.dropLast()) - } - - self.socketURL = cleanedURL - for option in options { switch option { case let .ConnectParams(params): @@ -98,19 +91,32 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable continue } } - + self.options.insertIgnore(.Path("/socket.io")) - + super.init() } - + /** Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity. - If using Swift it's recommended to use `init(var socketURL: String, options: Set)` + If using Swift it's recommended to use `init(var socketURL: NSURL, options: Set)` */ - public convenience init(socketURL: String, options: NSDictionary?) { - self.init(socketURL: socketURL, - options: options?.toSocketOptionsSet() ?? []) + public convenience init(socketURL: NSURL, options: NSDictionary?) { + self.init(socketURL: socketURL, options: options?.toSocketOptionsSet() ?? []) + } + + /// Please use the NSURL based init + @available(*, deprecated=5.3) + public convenience init(socketURLString: String, options: Set = []) { + guard let url = NSURL(string: socketURLString) else { fatalError("Incorrect url") } + self.init(socketURL: url, options: options) + } + + /// Please use the NSURL based init + @available(*, deprecated=5.3) + public convenience init(socketURLString: String, options: NSDictionary?) { + guard let url = NSURL(string: socketURLString) else { fatalError("Incorrect url") } + self.init(socketURL: url, options: options?.toSocketOptionsSet() ?? []) } deinit {