From c9ac69f4085f896f8589ff58561c19397025fb6b Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 14:55:58 -0500 Subject: [PATCH 01/10] 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 { From d912796fa5e94974b7095e5116540a1e5d3e50cb Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 15:52:54 -0500 Subject: [PATCH 02/10] engine websocket url to nsurl --- Source/SocketEngine.swift | 37 ++++++++++++++++++++--------------- Source/SocketEngineSpec.swift | 2 +- Source/SocketIOClient.swift | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 15bb6d4..0daba92 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -46,9 +46,9 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb public private(set) var probing = false public private(set) var session: NSURLSession? public private(set) var sid = "" - public private(set) var socketPath = "/engine.io" + public private(set) var socketPath = "/engine.io/" public private(set) var urlPolling = "" - public private(set) var urlWebSocket = "" + public private(set) var urlWebSocket = NSURL() public private(set) var websocket = false public private(set) var ws: WebSocket? @@ -199,9 +199,9 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - private func createURLs(params: [String: AnyObject]?) -> (String, String) { + private func createURLs(params: [String: AnyObject]?) -> (String, NSURL) { if client == nil { - return ("", "") + return ("", NSURL()) } let absURL = url.absoluteString["https?://"] <~ "" @@ -215,14 +215,17 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb let socketURL = "\(baseURL)\(socketPath)/?transport=" var urlPolling: String - var urlWebSocket: String + var queryString = "transport=websocket" + let urlWebSocket = NSURLComponents(string: url.absoluteString)! + + urlWebSocket.path = socketPath if secure { urlPolling = "https://" + socketURL + "polling" - urlWebSocket = "wss://" + socketURL + "websocket" + urlWebSocket.scheme = "wss" } else { urlPolling = "http://" + socketURL + "polling" - urlWebSocket = "ws://" + socketURL + "websocket" + urlWebSocket.scheme = "ws" } if params != nil { @@ -230,27 +233,29 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb let keyEsc = key.stringByAddingPercentEncodingWithAllowedCharacters( allowedCharacterSet)! urlPolling += "&\(keyEsc)=" - urlWebSocket += "&\(keyEsc)=" + queryString += "&\(keyEsc)=" if value is String { let valueEsc = (value as! String).stringByAddingPercentEncodingWithAllowedCharacters( allowedCharacterSet)! - urlPolling += "\(valueEsc)" - urlWebSocket += "\(valueEsc)" + urlPolling += String(valueEsc) + queryString += String(value) } else { - urlPolling += "\(value)" - urlWebSocket += "\(value)" + urlPolling += String(value) + queryString += String(value) } } } - return (urlPolling, urlWebSocket) + urlWebSocket.query = queryString + return (urlPolling, urlWebSocket.URL!) } private func createWebsocketAndConnect() { - let wsUrl = urlWebSocket + (sid == "" ? "" : "&sid=\(sid)") - - ws = WebSocket(url: NSURL(string: wsUrl)!) + let component = NSURLComponents(URL: urlWebSocket, resolvingAgainstBaseURL: false)! + component.query = component.query! + (sid == "" ? "" : "&sid=\(sid)") + + ws = WebSocket(url: component.URL!) if cookies != nil { let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!) diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 64cd6e1..afa84f5 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -43,7 +43,7 @@ import Foundation var sid: String { get } var socketPath: String { get } var urlPolling: String { get } - var urlWebSocket: String { get } + var urlWebSocket: NSURL { get } var websocket: Bool { get } init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 218c8ca..11c7ea1 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -92,7 +92,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable } } - self.options.insertIgnore(.Path("/socket.io")) + self.options.insertIgnore(.Path("/socket.io/")) super.init() } From b67b6abbdfaa87abcf86ae7ec72da0f951e73b7a Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 16:21:52 -0500 Subject: [PATCH 03/10] engine polling to nsurl --- Source/SocketEngine.swift | 50 ++++++++++--------------------- Source/SocketEnginePollable.swift | 4 +-- Source/SocketEngineSpec.swift | 9 +++++- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 0daba92..83be7b3 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -47,7 +47,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb public private(set) var session: NSURLSession? public private(set) var sid = "" public private(set) var socketPath = "/engine.io/" - public private(set) var urlPolling = "" + public private(set) var urlPolling = NSURL() public private(set) var urlWebSocket = NSURL() public private(set) var websocket = false public private(set) var ws: WebSocket? @@ -199,56 +199,38 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - private func createURLs(params: [String: AnyObject]?) -> (String, NSURL) { + private func createURLs(params: [String: AnyObject]?) -> (NSURL, NSURL) { if client == nil { - return ("", NSURL()) + return (NSURL(), NSURL()) } - 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 queryString = "transport=websocket" + let urlPolling = NSURLComponents(string: url.absoluteString)! let urlWebSocket = NSURLComponents(string: url.absoluteString)! + var queryString = "" urlWebSocket.path = socketPath + urlPolling.path = socketPath + urlWebSocket.query = "transport=websocket" + urlPolling.query = "transport=polling&b64=1" if secure { - urlPolling = "https://" + socketURL + "polling" + urlPolling.scheme = "https" urlWebSocket.scheme = "wss" } else { - urlPolling = "http://" + socketURL + "polling" + urlPolling.scheme = "http" urlWebSocket.scheme = "ws" } if params != nil { for (key, value) in params! { - let keyEsc = key.stringByAddingPercentEncodingWithAllowedCharacters( - allowedCharacterSet)! - urlPolling += "&\(keyEsc)=" - queryString += "&\(keyEsc)=" - - if value is String { - let valueEsc = (value as! String).stringByAddingPercentEncodingWithAllowedCharacters( - allowedCharacterSet)! - urlPolling += String(valueEsc) - queryString += String(value) - } else { - urlPolling += String(value) - queryString += String(value) - } + queryString += "&\(key)=\(value)" } } - urlWebSocket.query = queryString - return (urlPolling, urlWebSocket.URL!) + urlWebSocket.query = urlWebSocket.query! + queryString + urlPolling.query = urlPolling.query! + queryString + + return (urlPolling.URL!, urlWebSocket.URL!) } private func createWebsocketAndConnect() { @@ -411,7 +393,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb return } - let reqPolling = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!) + let reqPolling = NSMutableURLRequest(URL: urlPolling) if cookies != nil { let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!) diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index cd8e512..8a821cd 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -71,7 +71,7 @@ extension SocketEnginePollable { postWait.removeAll(keepCapacity: false) - let req = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&sid=\(sid)")!) + let req = NSMutableURLRequest(URL: urlPollingWithSid) addHeaders(req) @@ -93,7 +93,7 @@ extension SocketEnginePollable { } waitingForPoll = true - let req = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&sid=\(sid)&b64=1")!) + let req = NSMutableURLRequest(URL: urlPollingWithSid) addHeaders(req) doLongPoll(req) diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index afa84f5..635fb66 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -42,7 +42,7 @@ import Foundation var handleQueue: dispatch_queue_t! { get } var sid: String { get } var socketPath: String { get } - var urlPolling: String { get } + var urlPolling: NSURL { get } var urlWebSocket: NSURL { get } var websocket: Bool { get } @@ -59,6 +59,13 @@ import Foundation } extension SocketEngineSpec { + var urlPollingWithSid: NSURL { + let com = NSURLComponents(URL: urlPolling, resolvingAgainstBaseURL: false)! + com.query = com.query! + "&sid=\(sid)" + + return com.URL! + } + func createBinaryDataForSend(data: NSData) -> Either { if websocket { var byteArray = [UInt8](count: 1, repeatedValue: 0x4) From f9c665a542448da5152c96cddbb7878a518f5f13 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 17:23:57 -0500 Subject: [PATCH 04/10] for whatever reason I was able trigger a race condition because of the last commit --- Source/SwiftRegex.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/SwiftRegex.swift b/Source/SwiftRegex.swift index 8ea2d0e..b7c134b 100644 --- a/Source/SwiftRegex.swift +++ b/Source/SwiftRegex.swift @@ -15,6 +15,7 @@ import Foundation infix operator <~ { associativity none precedence 130 } +private let lock = dispatch_semaphore_create(1) private var swiftRegexCache = [String: NSRegularExpression]() internal final class SwiftRegex: NSObject, BooleanType { @@ -22,6 +23,10 @@ internal final class SwiftRegex: NSObject, BooleanType { var regex: NSRegularExpression init(target:String, pattern:String, options:NSRegularExpressionOptions?) { + if dispatch_semaphore_wait(lock, dispatch_time(DISPATCH_TIME_NOW, Int64(10 * NSEC_PER_MSEC))) != 0 { + fatalError("This should never happen") + } + self.target = target if let regex = swiftRegexCache[pattern] { self.regex = regex @@ -36,6 +41,7 @@ internal final class SwiftRegex: NSObject, BooleanType { self.regex = NSRegularExpression() } } + dispatch_semaphore_signal(lock) super.init() } From efe0d01592ded6165992273da1c61bb92571b839 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 18:23:15 -0500 Subject: [PATCH 05/10] update docs --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c625a9c..f9867e0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Socket.IO-client for iOS/OS X. ##Example ```swift -let socket = SocketIOClient(socketURL: "localhost:8080", options: [.Log(true), .ForcePolling(true)]) +let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080")!, options: [.Log(true), .ForcePolling(true)]) socket.on("connect") {data, ack in print("socket connected") @@ -26,7 +26,8 @@ socket.connect() ##Objective-C Example ```objective-c -SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:@{@"log": @YES, @"forcePolling": @YES}]; +NSURL* url = [[NSURL alloc] initWithString:@"http://localhost:8080"]; +SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:url options:@{@"log": @YES, @"forcePolling": @YES}]; [socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) { NSLog(@"socket connected"); @@ -136,9 +137,9 @@ Run `seed install`. ##API Constructors ----------- -`init(var socketURL: String, options: Set = [])` - Creates a new SocketIOClient. opts is a Set of SocketIOClientOption. If your socket.io server is secure, you need to specify `https` in your socketURL. +`init(var socketURL: NSURL, options: Set = [])` - Creates a new SocketIOClient. options is a Set of SocketIOClientOption. If your socket.io server is secure, you need to specify `https` in your socketURL. -`convenience init(socketURL: String, options: NSDictionary?)` - Same as above, but meant for Objective-C. See Options on how convert between SocketIOClientOptions and dictionary keys. +`convenience init(socketURL: NSURL, options: NSDictionary?)` - Same as above, but meant for Objective-C. See Options on how convert between SocketIOClientOptions and dictionary keys. Options ------- From 3f57c7e0a9a24fa120f37aadbe88b11dd1be2dc3 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 18:48:21 -0500 Subject: [PATCH 06/10] add default urls --- SocketIO-MacTests/SocketEngineTest.swift | 4 ++-- Source/SocketEngine.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 317281e..90ef328 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: NSURL()) - engine = SocketEngine(client: client, url: NSURL(), options: nil) + client = SocketIOClient(socketURL: NSURL(string: "http://localhost")!) + engine = SocketEngine(client: client, url: NSURL(string: "http://localhost")!, options: nil) client.setTestable() } diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 83be7b3..791f016 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -47,8 +47,8 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb public private(set) var session: NSURLSession? public private(set) var sid = "" public private(set) var socketPath = "/engine.io/" - public private(set) var urlPolling = NSURL() - public private(set) var urlWebSocket = NSURL() + public private(set) var urlPolling = NSURL(string: "http://localhost?default=")! + public private(set) var urlWebSocket = NSURL(string: "http://localhost?default=")! public private(set) var websocket = false public private(set) var ws: WebSocket? From 57670ec613997d3c8389c3827f30447908fcee60 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 19:02:47 -0500 Subject: [PATCH 07/10] move connectparams to the engine --- Source/SocketEngine.swift | 24 +++++++++++++----------- Source/SocketEngineSpec.swift | 3 ++- Source/SocketIOClient.swift | 7 ++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 791f016..0bb6557 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -29,6 +29,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb public let handleQueue = dispatch_queue_create("com.socketio.engineHandleQueue", DISPATCH_QUEUE_SERIAL) public let parseQueue = dispatch_queue_create("com.socketio.engineParseQueue", DISPATCH_QUEUE_SERIAL) + public var connectParams: [String: AnyObject]? public var postWait = [String]() public var waitingForPoll = false public var waitingForPost = false @@ -47,8 +48,8 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb public private(set) var session: NSURLSession? public private(set) var sid = "" public private(set) var socketPath = "/engine.io/" - public private(set) var urlPolling = NSURL(string: "http://localhost?default=")! - public private(set) var urlWebSocket = NSURL(string: "http://localhost?default=")! + public private(set) var urlPolling = NSURL() + public private(set) var urlWebSocket = NSURL() public private(set) var websocket = false public private(set) var ws: WebSocket? @@ -63,7 +64,6 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb private let logType = "SocketEngine" private let url: NSURL - private var connectParams: [String: AnyObject]? private var pingInterval: Double? private var pingTimeout = 0.0 { didSet { @@ -83,6 +83,8 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb for option in options { switch option { + case let .ConnectParams(params): + connectParams = params case let .SessionDelegate(delegate): sessionDelegate = delegate case let .ForcePolling(force): @@ -105,6 +107,10 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb continue } } + + super.init() + + (urlPolling, urlWebSocket) = createURLs() } public convenience init(client: SocketEngineClient, url: NSURL, options: NSDictionary?) { @@ -199,7 +205,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - private func createURLs(params: [String: AnyObject]?) -> (NSURL, NSURL) { + private func createURLs() -> (NSURL, NSURL) { if client == nil { return (NSURL(), NSURL()) } @@ -221,8 +227,8 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb urlWebSocket.scheme = "ws" } - if params != nil { - for (key, value) in params! { + if connectParams != nil { + for (key, value) in connectParams! { queryString += "&\(key)=\(value)" } } @@ -370,22 +376,18 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb } } - public func open(opts: [String: AnyObject]?) { + public func open() { if connected { DefaultSocketLogger.Logger.error("Engine tried opening while connected. This is probably a programming error. " + "Abandoning open attempt", type: logType) return } - connectParams = opts - DefaultSocketLogger.Logger.log("Starting engine", type: logType) DefaultSocketLogger.Logger.log("Handshaking", type: logType) resetEngine() - (urlPolling, urlWebSocket) = createURLs(opts) - if forceWebsockets { polling = false websocket = true diff --git a/Source/SocketEngineSpec.swift b/Source/SocketEngineSpec.swift index 635fb66..1703d98 100644 --- a/Source/SocketEngineSpec.swift +++ b/Source/SocketEngineSpec.swift @@ -29,6 +29,7 @@ import Foundation weak var client: SocketEngineClient? { get set } var closed: Bool { get } var connected: Bool { get } + var connectParams: [String: AnyObject]? { get set } var cookies: [NSHTTPCookie]? { get } var extraHeaders: [String: String]? { get } var fastUpgrade: Bool { get } @@ -52,7 +53,7 @@ import Foundation func didError(error: String) func doFastUpgrade() func flushWaitingForPostToWebSocket() - func open(opts: [String: AnyObject]?) + func open() func parseEngineData(data: NSData) func parseEngineMessage(message: String, fromPolling: Bool) func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 11c7ea1..8c3fff7 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -30,7 +30,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable public private(set) var engine: SocketEngineSpec? public private(set) var status = SocketIOClientStatus.NotConnected - public var connectParams: [String: AnyObject]? public var forceNew = false public var nsp = "/" public var options: Set @@ -69,8 +68,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable for option in options { switch option { - case let .ConnectParams(params): - connectParams = params case let .Reconnects(reconnects): self.reconnects = reconnects case let .ReconnectAttempts(attempts): @@ -164,9 +161,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable status = .Connecting if engine == nil || forceNew { - addEngine().open(connectParams) + addEngine().open() } else { - engine?.open(connectParams) + engine?.open() } guard timeoutAfter != 0 else { return } From 5060f90a79592d5523873e35d0275672eb0e419c Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 25 Jan 2016 19:13:17 -0500 Subject: [PATCH 08/10] we need to update the urls if connectparams changes --- Source/SocketEngine.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 0bb6557..334ec42 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -29,7 +29,11 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb public let handleQueue = dispatch_queue_create("com.socketio.engineHandleQueue", DISPATCH_QUEUE_SERIAL) public let parseQueue = dispatch_queue_create("com.socketio.engineParseQueue", DISPATCH_QUEUE_SERIAL) - public var connectParams: [String: AnyObject]? + public var connectParams: [String: AnyObject]? { + didSet { + (urlPolling, urlWebSocket) = createURLs() + } + } public var postWait = [String]() public var waitingForPoll = false public var waitingForPost = false From e38c4081ecb781b98f5539b5c94a1157f670b202 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 26 Jan 2016 10:51:53 -0500 Subject: [PATCH 09/10] comments and style --- Source/SocketEngine.swift | 2 +- Source/SocketEnginePollable.swift | 2 +- Source/SocketIOClient.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 334ec42..b5ebdf4 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -152,7 +152,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb switch code { case 0: // Unknown transport didError(error) - case 1: // Unknown sid. clear and retry connect + case 1: // Unknown sid. didError(error) case 2: // Bad handshake request didError(error) diff --git a/Source/SocketEnginePollable.swift b/Source/SocketEnginePollable.swift index 8a821cd..b871e2d 100644 --- a/Source/SocketEnginePollable.swift +++ b/Source/SocketEnginePollable.swift @@ -112,7 +112,7 @@ extension SocketEnginePollable { func doLongPoll(req: NSURLRequest) { doRequest(req) {[weak self] data, res, err in - guard let this = self else {return} + guard let this = self else { return } if err != nil || data == nil { DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling") diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 8c3fff7..c349202 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -96,7 +96,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable /** 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: NSURL, options: Set)` + If using Swift it's recommended to use `init(socketURL: NSURL, options: Set)` */ public convenience init(socketURL: NSURL, options: NSDictionary?) { self.init(socketURL: socketURL, options: options?.toSocketOptionsSet() ?? []) From c5c00510e53591d0c69bfe37d2b82b1af739029e Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 26 Jan 2016 11:03:32 -0500 Subject: [PATCH 10/10] remove unused property --- Source/SocketEngine.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index b5ebdf4..99f5b43 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -64,7 +64,6 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb private typealias Probe = (msg: String, type: SocketEnginePacketType, data: [NSData]) private typealias ProbeWaitQueue = [Probe] - private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet private let logType = "SocketEngine" private let url: NSURL