work on swift3 syntax
This commit is contained in:
parent
2f1f77141e
commit
4d4362b250
@ -1,4 +1,7 @@
|
||||
language: objective-c
|
||||
branches:
|
||||
except:
|
||||
- swift3
|
||||
xcode_project: Socket.IO-Client-Swift.xcodeproj # path to your xcodeproj folder
|
||||
xcode_scheme: SocketIO-iOS
|
||||
osx_image: xcode7.3
|
||||
|
||||
@ -86,27 +86,27 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
|
||||
for option in options {
|
||||
switch option {
|
||||
case let .ConnectParams(params):
|
||||
case let .connectParams(params):
|
||||
connectParams = params
|
||||
case let .Cookies(cookies):
|
||||
case let .cookies(cookies):
|
||||
self.cookies = cookies
|
||||
case let .DoubleEncodeUTF8(encode):
|
||||
case let .doubleEncodeUTF8(encode):
|
||||
doubleEncodeUTF8 = encode
|
||||
case let .ExtraHeaders(headers):
|
||||
case let .extraHeaders(headers):
|
||||
extraHeaders = headers
|
||||
case let .SessionDelegate(delegate):
|
||||
case let .sessionDelegate(delegate):
|
||||
sessionDelegate = delegate
|
||||
case let .ForcePolling(force):
|
||||
case let .forcePolling(force):
|
||||
forcePolling = force
|
||||
case let .ForceWebsockets(force):
|
||||
case let .forceWebsockets(force):
|
||||
forceWebsockets = force
|
||||
case let .Path(path):
|
||||
case let .path(path):
|
||||
socketPath = path
|
||||
case let .VoipEnabled(enable):
|
||||
case let .voipEnabled(enable):
|
||||
voipEnabled = enable
|
||||
case let .Secure(secure):
|
||||
case let .secure(secure):
|
||||
self.secure = secure
|
||||
case let .SelfSigned(selfSigned):
|
||||
case let .selfSigned(selfSigned):
|
||||
self.selfSigned = selfSigned
|
||||
default:
|
||||
continue
|
||||
@ -129,12 +129,12 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
}
|
||||
|
||||
private func checkAndHandleEngineError(msg: String) {
|
||||
guard let stringData = msg.dataUsingEncoding(NSUTF8StringEncoding,
|
||||
guard let stringData = msg.data(usingEncoding: NSUTF8StringEncoding,
|
||||
allowLossyConversion: false) else { return }
|
||||
|
||||
do {
|
||||
if let dict = try NSJSONSerialization.JSONObjectWithData(stringData,
|
||||
options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {
|
||||
if let dict = try NSJSONSerialization.jsonObject(with: stringData,
|
||||
options: NSJSONReadingOptions.mutableContainers) as? NSDictionary {
|
||||
guard let code = dict["code"] as? Int else { return }
|
||||
guard let error = dict["message"] as? String else { return }
|
||||
|
||||
@ -159,10 +159,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
private func checkIfMessageIsBase64Binary(message: String) -> Bool {
|
||||
if message.hasPrefix("b4") {
|
||||
// binary in base64 string
|
||||
let noPrefix = message[message.startIndex.advancedBy(2)..<message.endIndex]
|
||||
let noPrefix = message[message.startIndex.advanced(by: 2)..<message.endIndex]
|
||||
|
||||
if let data = NSData(base64EncodedString: noPrefix,
|
||||
options: .IgnoreUnknownCharacters) {
|
||||
options: .ignoreUnknownCharacters) {
|
||||
client?.parseEngineBinaryData(data)
|
||||
}
|
||||
|
||||
@ -191,10 +191,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
return
|
||||
}
|
||||
|
||||
let reqPolling = NSMutableURLRequest(URL: urlPolling)
|
||||
let reqPolling = NSMutableURLRequest(url: urlPolling)
|
||||
|
||||
if cookies != nil {
|
||||
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!)
|
||||
let headers = NSHTTPCookie.requestHeaderFields(with: cookies!)
|
||||
reqPolling.allHTTPHeaderFields = headers
|
||||
}
|
||||
|
||||
@ -238,14 +238,14 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
urlWebSocket.query = urlWebSocket.query! + queryString
|
||||
urlPolling.query = urlPolling.query! + queryString
|
||||
|
||||
return (urlPolling.URL!, urlWebSocket.URL!)
|
||||
return (urlPolling.url!, urlWebSocket.url!)
|
||||
}
|
||||
|
||||
private func createWebsocketAndConnect() {
|
||||
ws = WebSocket(url: urlWebSocketWithSid)
|
||||
|
||||
if cookies != nil {
|
||||
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!)
|
||||
let headers = NSHTTPCookie.requestHeaderFields(with: cookies!)
|
||||
for (key, value) in headers {
|
||||
ws?.headers[key] = value
|
||||
}
|
||||
@ -325,7 +325,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
self.write(waiter.msg, withType: waiter.type, withData: waiter.data)
|
||||
}
|
||||
|
||||
self.probeWait.removeAll(keepCapacity: false)
|
||||
self.probeWait.removeAll(keepingCapacity: false)
|
||||
|
||||
if self.postWait.count != 0 {
|
||||
self.flushWaitingForPostToWebSocket()
|
||||
@ -342,7 +342,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
ws.writeString(fixDoubleUTF8(msg))
|
||||
}
|
||||
|
||||
postWait.removeAll(keepCapacity: true)
|
||||
postWait.removeAll(keepingCapacity: true)
|
||||
}
|
||||
|
||||
private func handleClose(reason: String) {
|
||||
@ -358,10 +358,10 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
}
|
||||
|
||||
private func handleOpen(openData: String) {
|
||||
let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
|
||||
let mesData = openData.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false)!
|
||||
do {
|
||||
let json = try NSJSONSerialization.JSONObjectWithData(mesData,
|
||||
options: NSJSONReadingOptions.AllowFragments) as? NSDictionary
|
||||
let json = try NSJSONSerialization.jsonObject(with: mesData,
|
||||
options: NSJSONReadingOptions.allowFragments) as? NSDictionary
|
||||
if let sid = json?["sid"] as? String {
|
||||
let upgradeWs: Bool
|
||||
|
||||
@ -408,7 +408,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe
|
||||
|
||||
public func parseEngineData(data: NSData) {
|
||||
DefaultSocketLogger.Logger.log("Got binary data: %@", type: "SocketEngine", args: data)
|
||||
client?.parseEngineBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
|
||||
client?.parseEngineBinaryData(data.subdata(with: NSMakeRange(1, data.length - 1)))
|
||||
}
|
||||
|
||||
public func parseEngineMessage(message: String, fromPolling: Bool) {
|
||||
|
||||
@ -47,7 +47,7 @@ public protocol SocketEnginePollable : SocketEngineSpec {
|
||||
extension SocketEnginePollable {
|
||||
private func addHeaders(req: NSMutableURLRequest) {
|
||||
if cookies != nil {
|
||||
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!)
|
||||
let headers = NSHTTPCookie.requestHeaderFields(with: cookies!)
|
||||
req.allHTTPHeaderFields = headers
|
||||
}
|
||||
|
||||
@ -69,19 +69,19 @@ extension SocketEnginePollable {
|
||||
|
||||
DefaultSocketLogger.Logger.log("Created POST string: %@", type: "SocketEnginePolling", args: postStr)
|
||||
|
||||
postWait.removeAll(keepCapacity: false)
|
||||
postWait.removeAll(keepingCapacity: false)
|
||||
|
||||
let req = NSMutableURLRequest(URL: urlPollingWithSid)
|
||||
let req = NSMutableURLRequest(url: urlPollingWithSid)
|
||||
|
||||
addHeaders(req)
|
||||
|
||||
req.HTTPMethod = "POST"
|
||||
req.httpMethod = "POST"
|
||||
req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
|
||||
|
||||
let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding,
|
||||
let postData = postStr.data(usingEncoding: NSUTF8StringEncoding,
|
||||
allowLossyConversion: false)!
|
||||
|
||||
req.HTTPBody = postData
|
||||
req.httpBody = postData
|
||||
req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length")
|
||||
|
||||
return req
|
||||
@ -93,7 +93,7 @@ extension SocketEnginePollable {
|
||||
}
|
||||
|
||||
waitingForPoll = true
|
||||
let req = NSMutableURLRequest(URL: urlPollingWithSid)
|
||||
let req = NSMutableURLRequest(url: urlPollingWithSid)
|
||||
|
||||
addHeaders(req)
|
||||
doLongPoll(req)
|
||||
@ -107,7 +107,7 @@ extension SocketEnginePollable {
|
||||
|
||||
DefaultSocketLogger.Logger.log("Doing polling request", type: "SocketEnginePolling")
|
||||
|
||||
session?.dataTaskWithRequest(req, completionHandler: callback).resume()
|
||||
session?.dataTask(with: req, completionHandler: callback).resume()
|
||||
}
|
||||
|
||||
func doLongPoll(req: NSURLRequest) {
|
||||
|
||||
@ -61,36 +61,36 @@ import Foundation
|
||||
|
||||
extension SocketEngineSpec {
|
||||
var urlPollingWithSid: NSURL {
|
||||
let com = NSURLComponents(URL: urlPolling, resolvingAgainstBaseURL: false)!
|
||||
let com = NSURLComponents(url: urlPolling, resolvingAgainstBaseURL: false)!
|
||||
com.query = com.query! + "&sid=\(sid)"
|
||||
|
||||
return com.URL!
|
||||
return com.url!
|
||||
}
|
||||
|
||||
var urlWebSocketWithSid: NSURL {
|
||||
let com = NSURLComponents(URL: urlWebSocket, resolvingAgainstBaseURL: false)!
|
||||
let com = NSURLComponents(url: urlWebSocket, resolvingAgainstBaseURL: false)!
|
||||
com.query = com.query! + (sid == "" ? "" : "&sid=\(sid)")
|
||||
|
||||
return com.URL!
|
||||
return com.url!
|
||||
}
|
||||
|
||||
func createBinaryDataForSend(data: NSData) -> Either<NSData, String> {
|
||||
if websocket {
|
||||
var byteArray = [UInt8](count: 1, repeatedValue: 0x4)
|
||||
var byteArray = [UInt8](repeating: 0x4, count: 1)
|
||||
let mutData = NSMutableData(bytes: &byteArray, length: 1)
|
||||
|
||||
mutData.appendData(data)
|
||||
mutData.append(data)
|
||||
|
||||
return .Left(mutData)
|
||||
} else {
|
||||
let str = "b4" + data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
|
||||
let str = "b4" + data.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0))
|
||||
|
||||
return .Right(str)
|
||||
}
|
||||
}
|
||||
|
||||
func doubleEncodeUTF8(string: String) -> String {
|
||||
if let latin1 = string.dataUsingEncoding(NSUTF8StringEncoding),
|
||||
if let latin1 = string.data(usingEncoding: NSUTF8StringEncoding),
|
||||
utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding) {
|
||||
return utf8 as String
|
||||
} else {
|
||||
@ -99,7 +99,7 @@ extension SocketEngineSpec {
|
||||
}
|
||||
|
||||
func fixDoubleUTF8(string: String) -> String {
|
||||
if let utf8 = string.dataUsingEncoding(NSISOLatin1StringEncoding),
|
||||
if let utf8 = string.data(usingEncoding: NSISOLatin1StringEncoding),
|
||||
latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding) {
|
||||
return latin1 as String
|
||||
} else {
|
||||
|
||||
@ -71,33 +71,33 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
|
||||
self.socketURL = socketURL
|
||||
|
||||
if socketURL.absoluteString.hasPrefix("https://") {
|
||||
self.options.insertIgnore(.Secure(true))
|
||||
self.options.insertIgnore(.secure(true))
|
||||
}
|
||||
|
||||
for option in options {
|
||||
switch option {
|
||||
case let .Reconnects(reconnects):
|
||||
case let .reconnects(reconnects):
|
||||
self.reconnects = reconnects
|
||||
case let .ReconnectAttempts(attempts):
|
||||
case let .reconnectAttempts(attempts):
|
||||
reconnectAttempts = attempts
|
||||
case let .ReconnectWait(wait):
|
||||
case let .reconnectWait(wait):
|
||||
reconnectWait = abs(wait)
|
||||
case let .Nsp(nsp):
|
||||
case let .nsp(nsp):
|
||||
self.nsp = nsp
|
||||
case let .Log(log):
|
||||
case let .log(log):
|
||||
DefaultSocketLogger.Logger.log = log
|
||||
case let .Logger(logger):
|
||||
case let .logger(logger):
|
||||
DefaultSocketLogger.Logger = logger
|
||||
case let .HandleQueue(queue):
|
||||
case let .handleQueue(queue):
|
||||
handleQueue = queue
|
||||
case let .ForceNew(force):
|
||||
case let .forceNew(force):
|
||||
forceNew = force
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
self.options.insertIgnore(.Path("/socket.io/"))
|
||||
self.options.insertIgnore(.path("/socket.io/"))
|
||||
|
||||
super.init()
|
||||
}
|
||||
@ -409,7 +409,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
|
||||
/// Removes all handlers.
|
||||
/// Can be used after disconnecting to break any potential remaining retain cycles.
|
||||
public func removeAllHandlers() {
|
||||
handlers.removeAll(keepCapacity: false)
|
||||
handlers.removeAll(keepingCapacity: false)
|
||||
}
|
||||
|
||||
private func tryReconnectWithReason(reason: String) {
|
||||
|
||||
@ -29,67 +29,67 @@ protocol ClientOption : CustomStringConvertible, Hashable {
|
||||
}
|
||||
|
||||
public enum SocketIOClientOption : ClientOption {
|
||||
case ConnectParams([String: AnyObject])
|
||||
case Cookies([NSHTTPCookie])
|
||||
case DoubleEncodeUTF8(Bool)
|
||||
case ExtraHeaders([String: String])
|
||||
case ForceNew(Bool)
|
||||
case ForcePolling(Bool)
|
||||
case ForceWebsockets(Bool)
|
||||
case HandleQueue(dispatch_queue_t)
|
||||
case Log(Bool)
|
||||
case Logger(SocketLogger)
|
||||
case Nsp(String)
|
||||
case Path(String)
|
||||
case Reconnects(Bool)
|
||||
case ReconnectAttempts(Int)
|
||||
case ReconnectWait(Int)
|
||||
case Secure(Bool)
|
||||
case SelfSigned(Bool)
|
||||
case SessionDelegate(NSURLSessionDelegate)
|
||||
case VoipEnabled(Bool)
|
||||
case connectParams([String: AnyObject])
|
||||
case cookies([NSHTTPCookie])
|
||||
case doubleEncodeUTF8(Bool)
|
||||
case extraHeaders([String: String])
|
||||
case forceNew(Bool)
|
||||
case forcePolling(Bool)
|
||||
case forceWebsockets(Bool)
|
||||
case handleQueue(dispatch_queue_t)
|
||||
case log(Bool)
|
||||
case logger(SocketLogger)
|
||||
case nsp(String)
|
||||
case path(String)
|
||||
case reconnects(Bool)
|
||||
case reconnectAttempts(Int)
|
||||
case reconnectWait(Int)
|
||||
case secure(Bool)
|
||||
case selfSigned(Bool)
|
||||
case sessionDelegate(NSURLSessionDelegate)
|
||||
case voipEnabled(Bool)
|
||||
|
||||
public var description: String {
|
||||
let description: String
|
||||
|
||||
switch self {
|
||||
case .ConnectParams:
|
||||
case .connectParams:
|
||||
description = "connectParams"
|
||||
case .Cookies:
|
||||
case .cookies:
|
||||
description = "cookies"
|
||||
case .DoubleEncodeUTF8:
|
||||
case .doubleEncodeUTF8:
|
||||
description = "doubleEncodeUTF8"
|
||||
case .ExtraHeaders:
|
||||
case .extraHeaders:
|
||||
description = "extraHeaders"
|
||||
case .ForceNew:
|
||||
case .forceNew:
|
||||
description = "forceNew"
|
||||
case .ForcePolling:
|
||||
case .forcePolling:
|
||||
description = "forcePolling"
|
||||
case .ForceWebsockets:
|
||||
case .forceWebsockets:
|
||||
description = "forceWebsockets"
|
||||
case .HandleQueue:
|
||||
case .handleQueue:
|
||||
description = "handleQueue"
|
||||
case .Log:
|
||||
case .log:
|
||||
description = "log"
|
||||
case .Logger:
|
||||
case .logger:
|
||||
description = "logger"
|
||||
case .Nsp:
|
||||
case .nsp:
|
||||
description = "nsp"
|
||||
case .Path:
|
||||
case .path:
|
||||
description = "path"
|
||||
case .Reconnects:
|
||||
case .reconnects:
|
||||
description = "reconnects"
|
||||
case .ReconnectAttempts:
|
||||
case .reconnectAttempts:
|
||||
description = "reconnectAttempts"
|
||||
case .ReconnectWait:
|
||||
case .reconnectWait:
|
||||
description = "reconnectWait"
|
||||
case .Secure:
|
||||
case .secure:
|
||||
description = "secure"
|
||||
case .SelfSigned:
|
||||
case .selfSigned:
|
||||
description = "selfSigned"
|
||||
case .SessionDelegate:
|
||||
case .sessionDelegate:
|
||||
description = "sessionDelegate"
|
||||
case .VoipEnabled:
|
||||
case .voipEnabled:
|
||||
description = "voipEnabled"
|
||||
}
|
||||
|
||||
@ -104,43 +104,43 @@ public enum SocketIOClientOption : ClientOption {
|
||||
let value: AnyObject
|
||||
|
||||
switch self {
|
||||
case let .ConnectParams(params):
|
||||
case let .connectParams(params):
|
||||
value = params
|
||||
case let .Cookies(cookies):
|
||||
case let .cookies(cookies):
|
||||
value = cookies
|
||||
case let .DoubleEncodeUTF8(encode):
|
||||
case let .doubleEncodeUTF8(encode):
|
||||
value = encode
|
||||
case let .ExtraHeaders(headers):
|
||||
case let .extraHeaders(headers):
|
||||
value = headers
|
||||
case let .ForceNew(force):
|
||||
case let .forceNew(force):
|
||||
value = force
|
||||
case let .ForcePolling(force):
|
||||
case let .forcePolling(force):
|
||||
value = force
|
||||
case let .ForceWebsockets(force):
|
||||
case let .forceWebsockets(force):
|
||||
value = force
|
||||
case let .HandleQueue(queue):
|
||||
case let .handleQueue(queue):
|
||||
value = queue
|
||||
case let .Log(log):
|
||||
case let .log(log):
|
||||
value = log
|
||||
case let .Logger(logger):
|
||||
case let .logger(logger):
|
||||
value = logger
|
||||
case let .Nsp(nsp):
|
||||
case let .nsp(nsp):
|
||||
value = nsp
|
||||
case let .Path(path):
|
||||
case let .path(path):
|
||||
value = path
|
||||
case let .Reconnects(reconnects):
|
||||
case let .reconnects(reconnects):
|
||||
value = reconnects
|
||||
case let .ReconnectAttempts(attempts):
|
||||
case let .reconnectAttempts(attempts):
|
||||
value = attempts
|
||||
case let .ReconnectWait(wait):
|
||||
case let .reconnectWait(wait):
|
||||
value = wait
|
||||
case let .Secure(secure):
|
||||
case let .secure(secure):
|
||||
value = secure
|
||||
case let .SelfSigned(signed):
|
||||
case let .selfSigned(signed):
|
||||
value = signed
|
||||
case let .SessionDelegate(delegate):
|
||||
case let .sessionDelegate(delegate):
|
||||
value = delegate
|
||||
case let .VoipEnabled(enabled):
|
||||
case let .voipEnabled(enabled):
|
||||
value = enabled
|
||||
}
|
||||
|
||||
@ -164,43 +164,43 @@ extension NSDictionary {
|
||||
private static func keyValueToSocketIOClientOption(key: String, value: AnyObject) -> SocketIOClientOption? {
|
||||
switch (key, value) {
|
||||
case let ("connectParams", params as [String: AnyObject]):
|
||||
return .ConnectParams(params)
|
||||
return .connectParams(params)
|
||||
case let ("cookies", cookies as [NSHTTPCookie]):
|
||||
return .Cookies(cookies)
|
||||
return .cookies(cookies)
|
||||
case let ("doubleEncodeUTF8", encode as Bool):
|
||||
return .DoubleEncodeUTF8(encode)
|
||||
return .doubleEncodeUTF8(encode)
|
||||
case let ("extraHeaders", headers as [String: String]):
|
||||
return .ExtraHeaders(headers)
|
||||
return .extraHeaders(headers)
|
||||
case let ("forceNew", force as Bool):
|
||||
return .ForceNew(force)
|
||||
return .forceNew(force)
|
||||
case let ("forcePolling", force as Bool):
|
||||
return .ForcePolling(force)
|
||||
return .forcePolling(force)
|
||||
case let ("forceWebsockets", force as Bool):
|
||||
return .ForceWebsockets(force)
|
||||
return .forceWebsockets(force)
|
||||
case let ("handleQueue", queue as dispatch_queue_t):
|
||||
return .HandleQueue(queue)
|
||||
return .handleQueue(queue)
|
||||
case let ("log", log as Bool):
|
||||
return .Log(log)
|
||||
return .log(log)
|
||||
case let ("logger", logger as SocketLogger):
|
||||
return .Logger(logger)
|
||||
return .logger(logger)
|
||||
case let ("nsp", nsp as String):
|
||||
return .Nsp(nsp)
|
||||
return .nsp(nsp)
|
||||
case let ("path", path as String):
|
||||
return .Path(path)
|
||||
return .path(path)
|
||||
case let ("reconnects", reconnects as Bool):
|
||||
return .Reconnects(reconnects)
|
||||
return .reconnects(reconnects)
|
||||
case let ("reconnectAttempts", attempts as Int):
|
||||
return .ReconnectAttempts(attempts)
|
||||
return .reconnectAttempts(attempts)
|
||||
case let ("reconnectWait", wait as Int):
|
||||
return .ReconnectWait(wait)
|
||||
return .reconnectWait(wait)
|
||||
case let ("secure", secure as Bool):
|
||||
return .Secure(secure)
|
||||
return .secure(secure)
|
||||
case let ("selfSigned", selfSigned as Bool):
|
||||
return .SelfSigned(selfSigned)
|
||||
return .selfSigned(selfSigned)
|
||||
case let ("sessionDelegate", delegate as NSURLSessionDelegate):
|
||||
return .SessionDelegate(delegate)
|
||||
return .sessionDelegate(delegate)
|
||||
case let ("voipEnabled", enable as Bool):
|
||||
return .VoipEnabled(enable)
|
||||
return .voipEnabled(enable)
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -47,7 +47,7 @@ public extension SocketLogger {
|
||||
private func abstractLog(logType: String, message: String, type: String, args: [AnyObject]) {
|
||||
guard log else { return }
|
||||
|
||||
let newArgs = args.map({arg -> CVarArgType in String(arg)})
|
||||
let newArgs = args.map({arg -> CVarArg in String(arg)})
|
||||
let replaced = String(format: message, arguments: newArgs)
|
||||
|
||||
NSLog("%@ %@: %@", logType, type, replaced)
|
||||
|
||||
@ -94,7 +94,7 @@ struct SocketPacket {
|
||||
}
|
||||
|
||||
do {
|
||||
let jsonSend = try NSJSONSerialization.dataWithJSONObject(data,
|
||||
let jsonSend = try NSJSONSerialization.data(withJSONObject: data,
|
||||
options: NSJSONWritingOptions(rawValue: 0))
|
||||
guard let jsonString = String(data: jsonSend, encoding: NSUTF8StringEncoding) else {
|
||||
return "[]"
|
||||
@ -235,7 +235,7 @@ extension SocketPacket {
|
||||
|
||||
private extension SocketPacket {
|
||||
// Recursive function that looks for NSData in collections
|
||||
static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject {
|
||||
static func shred(data: AnyObject, binary: inout [NSData]) -> AnyObject {
|
||||
let placeholder = ["_placeholder": true, "num": binary.count]
|
||||
|
||||
switch data {
|
||||
|
||||
@ -111,7 +111,7 @@ extension SocketParsable {
|
||||
}
|
||||
}
|
||||
|
||||
let d = message[parser.currentIndex.advancedBy(1)..<message.endIndex]
|
||||
let d = message[parser.currentIndex.advanced(by: 1)..<message.endIndex]
|
||||
let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] <~ "\"~~$2\""
|
||||
|
||||
switch parseData(noPlaceholders) {
|
||||
@ -131,10 +131,10 @@ extension SocketParsable {
|
||||
|
||||
// Parses data for events
|
||||
private func parseData(data: String) -> Either<String, [AnyObject]> {
|
||||
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
|
||||
let stringData = data.data(usingEncoding: NSUTF8StringEncoding, allowLossyConversion: false)
|
||||
do {
|
||||
if let arr = try NSJSONSerialization.JSONObjectWithData(stringData!,
|
||||
options: NSJSONReadingOptions.MutableContainers) as? [AnyObject] {
|
||||
if let arr = try NSJSONSerialization.jsonObject(with: stringData!,
|
||||
options: NSJSONReadingOptions.mutableContainers) as? [AnyObject] {
|
||||
return .Right(arr)
|
||||
} else {
|
||||
return .Left("Expected data array")
|
||||
|
||||
@ -39,11 +39,11 @@ struct SocketStringReader {
|
||||
}
|
||||
|
||||
mutating func advanceIndexBy(n: Int) {
|
||||
currentIndex = currentIndex.advancedBy(n)
|
||||
currentIndex = currentIndex.advanced(by: n)
|
||||
}
|
||||
|
||||
mutating func read(readLength: Int) -> String {
|
||||
let readString = message[currentIndex..<currentIndex.advancedBy(readLength)]
|
||||
let readString = message[currentIndex..<currentIndex.advanced(by: readLength)]
|
||||
advanceIndexBy(readLength)
|
||||
|
||||
return readString
|
||||
@ -51,18 +51,18 @@ struct SocketStringReader {
|
||||
|
||||
mutating func readUntilStringOccurence(string: String) -> String {
|
||||
let substring = message[currentIndex..<message.endIndex]
|
||||
guard let foundRange = substring.rangeOfString(string) else {
|
||||
guard let foundRange = substring.range(of: string) else {
|
||||
currentIndex = message.endIndex
|
||||
|
||||
return substring
|
||||
}
|
||||
|
||||
advanceIndexBy(message.startIndex.distanceTo(foundRange.startIndex) + 1)
|
||||
advanceIndexBy(message.startIndex.distance(to: foundRange.startIndex) + 1)
|
||||
|
||||
return substring.substringToIndex(foundRange.startIndex)
|
||||
return substring.substring(to: foundRange.startIndex)
|
||||
}
|
||||
|
||||
mutating func readUntilEnd() -> String {
|
||||
return read(currentIndex.distanceTo(message.endIndex))
|
||||
return read(currentIndex.distance(to: message.endIndex))
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ infix operator <~ { associativity none precedence 130 }
|
||||
private let lock = dispatch_semaphore_create(1)
|
||||
private var swiftRegexCache = [String: NSRegularExpression]()
|
||||
|
||||
internal final class SwiftRegex : NSObject, BooleanType {
|
||||
internal final class SwiftRegex : NSObject, Boolean {
|
||||
var target: String
|
||||
var regex: NSRegularExpression
|
||||
|
||||
@ -28,7 +28,7 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
if dispatch_semaphore_wait(lock, dispatch_time(DISPATCH_TIME_NOW, Int64(10 * NSEC_PER_MSEC))) != 0 {
|
||||
do {
|
||||
let regex = try NSRegularExpression(pattern: pattern, options:
|
||||
NSRegularExpressionOptions.DotMatchesLineSeparators)
|
||||
NSRegularExpressionOptions.dotMatchesLineSeparators)
|
||||
self.regex = regex
|
||||
} catch let error as NSError {
|
||||
SwiftRegex.failure("Error in pattern: \(pattern) - \(error)")
|
||||
@ -44,7 +44,7 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
} else {
|
||||
do {
|
||||
let regex = try NSRegularExpression(pattern: pattern, options:
|
||||
NSRegularExpressionOptions.DotMatchesLineSeparators)
|
||||
NSRegularExpressionOptions.dotMatchesLineSeparators)
|
||||
swiftRegexCache[pattern] = regex
|
||||
self.regex = regex
|
||||
} catch let error as NSError {
|
||||
@ -66,7 +66,7 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
|
||||
private func substring(range: NSRange) -> String? {
|
||||
if range.location != NSNotFound {
|
||||
return (target as NSString).substringWithRange(range)
|
||||
return (target as NSString).substring(with: range)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@ -77,7 +77,7 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
}
|
||||
|
||||
func range(options: NSMatchingOptions) -> NSRange {
|
||||
return regex.rangeOfFirstMatchInString(target as String, options: [], range: targetRange)
|
||||
return regex.rangeOfFirstMatch(in: target as String, options: [], range: targetRange)
|
||||
}
|
||||
|
||||
func match(options: NSMatchingOptions) -> String? {
|
||||
@ -85,8 +85,8 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
}
|
||||
|
||||
func groups() -> [String]? {
|
||||
return groupsForMatch(regex.firstMatchInString(target as String, options:
|
||||
NSMatchingOptions.WithoutAnchoringBounds, range: targetRange))
|
||||
return groupsForMatch(regex.firstMatch(in: target as String, options:
|
||||
NSMatchingOptions.withoutAnchoringBounds, range: targetRange))
|
||||
}
|
||||
|
||||
private func groupsForMatch(match: NSTextCheckingResult?) -> [String]? {
|
||||
@ -95,7 +95,7 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
}
|
||||
var groups = [String]()
|
||||
for groupno in 0...regex.numberOfCaptureGroups {
|
||||
if let group = substring(match.rangeAtIndex(groupno)) {
|
||||
if let group = substring(match.range(at: groupno)) {
|
||||
groups += [group]
|
||||
} else {
|
||||
groups += ["_"] // avoids bridging problems
|
||||
@ -114,11 +114,11 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
return
|
||||
}
|
||||
|
||||
for match in Array(matchResults().reverse()) {
|
||||
let replacement = regex.replacementStringForResult(match,
|
||||
inString: target as String, offset: 0, template: newValue!)
|
||||
for match in Array(matchResults().reversed()) {
|
||||
let replacement = regex.replacementString(for: match,
|
||||
in: target as String, offset: 0, template: newValue!)
|
||||
let mut = NSMutableString(string: target)
|
||||
mut.replaceCharactersInRange(match.rangeAtIndex(groupno), withString: replacement)
|
||||
mut.replaceCharacters(in: match.range(at: groupno), with: replacement)
|
||||
|
||||
target = mut as String
|
||||
}
|
||||
@ -126,8 +126,8 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
}
|
||||
|
||||
func matchResults() -> [NSTextCheckingResult] {
|
||||
let matches = regex.matchesInString(target as String, options:
|
||||
NSMatchingOptions.WithoutAnchoringBounds, range: targetRange)
|
||||
let matches = regex.matches(in: target as String, options:
|
||||
NSMatchingOptions.withoutAnchoringBounds, range: targetRange)
|
||||
as [NSTextCheckingResult]
|
||||
|
||||
return matches
|
||||
@ -148,7 +148,7 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
func dictionary(options: NSMatchingOptions!) -> Dictionary<String,String> {
|
||||
var out = Dictionary<String,String>()
|
||||
for match in matchResults() {
|
||||
out[substring(match.rangeAtIndex(1))!] = substring(match.rangeAtIndex(2))!
|
||||
out[substring(match.range(at: 1))!] = substring(match.range(at: 2))!
|
||||
}
|
||||
return out
|
||||
}
|
||||
@ -158,14 +158,14 @@ internal final class SwiftRegex : NSObject, BooleanType {
|
||||
let out = NSMutableString()
|
||||
var pos = 0
|
||||
|
||||
regex.enumerateMatchesInString(target as String, options: options, range: targetRange ) {match, flags, stop in
|
||||
regex.enumerateMatches(in: target as String, options: options, range: targetRange ) {match, flags, stop in
|
||||
let matchRange = match!.range
|
||||
out.appendString( self.substring(NSRange(location:pos, length:matchRange.location-pos))!)
|
||||
out.appendString( substitution(match!, stop) )
|
||||
out.append( self.substring(NSRange(location:pos, length:matchRange.location-pos))!)
|
||||
out.append( substitution(match!, stop) )
|
||||
pos = matchRange.location + matchRange.length
|
||||
}
|
||||
|
||||
out.appendString(substring(NSRange(location:pos, length:targetRange.length-pos))!)
|
||||
out.append(substring(NSRange(location:pos, length:targetRange.length-pos))!)
|
||||
|
||||
return out as String
|
||||
}
|
||||
@ -189,7 +189,6 @@ extension String {
|
||||
|
||||
func <~ (left: SwiftRegex, right: String) -> String {
|
||||
return left.substituteMatches({match, stop in
|
||||
return left.regex.replacementStringForResult( match,
|
||||
inString: left.target as String, offset: 0, template: right )
|
||||
return left.regex.replacementString(for: match, in: left.target as String, offset: 0, template: right )
|
||||
}, options: [])
|
||||
}
|
||||
|
||||
@ -109,7 +109,10 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
public var headers = [String: String]()
|
||||
public var voipEnabled = false
|
||||
public var selfSignedSSL = false
|
||||
#if swift(>=3)
|
||||
#else
|
||||
public var security: SSLSecurity?
|
||||
#endif
|
||||
public var enabledSSLCipherSuites: [SSLCipherSuite]?
|
||||
public var origin: String?
|
||||
public var isConnected :Bool {
|
||||
@ -166,12 +169,12 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
*/
|
||||
public func disconnect(forceTimeout forceTimeout: NSTimeInterval? = nil) {
|
||||
switch forceTimeout {
|
||||
case .Some(let seconds) where seconds > 0:
|
||||
case .some(let seconds) where seconds > 0:
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))), queue) { [weak self] in
|
||||
self?.disconnectStream(nil)
|
||||
}
|
||||
fallthrough
|
||||
case .None:
|
||||
case .none:
|
||||
writeError(CloseCode.Normal.rawValue)
|
||||
|
||||
default:
|
||||
@ -183,7 +186,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
///write a string to the websocket. This sends it as a text frame.
|
||||
public func writeString(str: String) {
|
||||
guard isConnected else { return }
|
||||
dequeueWrite(str.dataUsingEncoding(NSUTF8StringEncoding)!, code: .TextFrame)
|
||||
dequeueWrite(str.data(usingEncoding: NSUTF8StringEncoding)!, code: .TextFrame)
|
||||
}
|
||||
|
||||
///write binary data to the websocket. This sends it as a binary frame.
|
||||
@ -216,7 +219,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
addHeader(urlRequest, key: headerWSUpgradeName, val: headerWSUpgradeValue)
|
||||
addHeader(urlRequest, key: headerWSConnectionName, val: headerWSConnectionValue)
|
||||
if let protocols = optionalProtocols {
|
||||
addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joinWithSeparator(","))
|
||||
addHeader(urlRequest, key: headerWSProtocolName, val: protocols.joined(separator: ","))
|
||||
}
|
||||
addHeader(urlRequest, key: headerWSVersionName, val: headerWSVersionValue)
|
||||
addHeader(urlRequest, key: headerWSKeyName, val: generateWebSocketKey())
|
||||
@ -246,8 +249,8 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
let uni = UnicodeScalar(UInt32(97 + arc4random_uniform(25)))
|
||||
key += "\(Character(uni))"
|
||||
}
|
||||
let data = key.dataUsingEncoding(NSUTF8StringEncoding)
|
||||
let baseKey = data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
|
||||
let data = key.data(usingEncoding: NSUTF8StringEncoding)
|
||||
let baseKey = data?.base64EncodedString(NSDataBase64EncodingOptions(rawValue: 0))
|
||||
return baseKey!
|
||||
}
|
||||
|
||||
@ -280,6 +283,8 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
inStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String)
|
||||
outStream.setProperty(settings, forKey: kCFStreamPropertySSLSettings as String)
|
||||
}
|
||||
#if swift(>=3)
|
||||
#else
|
||||
if let cipherSuites = self.enabledSSLCipherSuites {
|
||||
if let sslContextIn = CFReadStreamCopyProperty(inputStream, kCFStreamPropertySSLContext) as! SSLContextRef?,
|
||||
sslContextOut = CFWriteStreamCopyProperty(outputStream, kCFStreamPropertySSLContext) as! SSLContextRef? {
|
||||
@ -297,6 +302,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
CFReadStreamSetDispatchQueue(inStream, WebSocket.sharedWorkQueue)
|
||||
CFWriteStreamSetDispatchQueue(outStream, WebSocket.sharedWorkQueue)
|
||||
inStream.open()
|
||||
@ -308,7 +314,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
|
||||
let bytes = UnsafePointer<UInt8>(data.bytes)
|
||||
var timeout = 5000000 //wait 5 seconds before giving up
|
||||
writeQueue.addOperationWithBlock { [weak self] in
|
||||
writeQueue.addOperation { [weak self] in
|
||||
while !outStream.hasSpaceAvailable {
|
||||
usleep(100) //wait until the socket is ready
|
||||
timeout -= 100
|
||||
@ -324,12 +330,13 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
}
|
||||
}
|
||||
//delegate for the stream methods. Processes incoming bytes
|
||||
public func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
|
||||
|
||||
public func stream(aStream: NSStream, handle eventCode: NSStreamEvent) {
|
||||
#if swift(>=3)
|
||||
#else
|
||||
if let sec = security where !certValidated && [.HasBytesAvailable, .HasSpaceAvailable].contains(eventCode) {
|
||||
let possibleTrust: AnyObject? = aStream.propertyForKey(kCFStreamPropertySSLPeerTrust as String)
|
||||
let possibleTrust: AnyObject? = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as String)
|
||||
if let trust: AnyObject = possibleTrust {
|
||||
let domain: AnyObject? = aStream.propertyForKey(kCFStreamSSLPeerName as String)
|
||||
let domain: AnyObject? = aStream.property(forKey: kCFStreamSSLPeerName as String)
|
||||
if sec.isValid(trust as! SecTrustRef, domain: domain as! String?) {
|
||||
certValidated = true
|
||||
} else {
|
||||
@ -339,13 +346,14 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
}
|
||||
}
|
||||
}
|
||||
if eventCode == .HasBytesAvailable {
|
||||
#endif
|
||||
if eventCode == .hasBytesAvailable {
|
||||
if aStream == inputStream {
|
||||
processInputStream()
|
||||
}
|
||||
} else if eventCode == .ErrorOccurred {
|
||||
} else if eventCode == .errorOccurred {
|
||||
disconnectStream(aStream.streamError)
|
||||
} else if eventCode == .EndEncountered {
|
||||
} else if eventCode == .endEncountered {
|
||||
disconnectStream(nil)
|
||||
}
|
||||
}
|
||||
@ -399,7 +407,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
var work = data
|
||||
if let fragBuffer = fragBuffer {
|
||||
let combine = NSMutableData(data: fragBuffer)
|
||||
combine.appendData(data)
|
||||
combine.append(data)
|
||||
work = combine
|
||||
self.fragBuffer = nil
|
||||
}
|
||||
@ -525,7 +533,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
extra = 0
|
||||
}
|
||||
response.bytesLeft -= len
|
||||
response.buffer?.appendData(NSData(bytes: buffer, length: len))
|
||||
response.buffer?.append(NSData(bytes: buffer, length: len))
|
||||
processResponse(response)
|
||||
let offset = bufferLen - extra
|
||||
if extra > 0 {
|
||||
@ -659,7 +667,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
writeError(errCode)
|
||||
return
|
||||
}
|
||||
response!.buffer!.appendData(data)
|
||||
response!.buffer!.append(data)
|
||||
}
|
||||
if let response = response {
|
||||
response.bytesLeft -= Int(len)
|
||||
@ -740,7 +748,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
}
|
||||
///used to write things to the stream
|
||||
private func dequeueWrite(data: NSData, code: OpCode) {
|
||||
writeQueue.addOperationWithBlock { [weak self] in
|
||||
writeQueue.addOperation { [weak self] in
|
||||
//stream isn't ready, let's wait
|
||||
guard let s = self else { return }
|
||||
var offset = 2
|
||||
@ -817,6 +825,8 @@ public class WebSocket : NSObject, NSStreamDelegate {
|
||||
|
||||
}
|
||||
|
||||
#if swift(>=3)
|
||||
#else
|
||||
public class SSLCert {
|
||||
var certData: NSData?
|
||||
var key: SecKeyRef?
|
||||
@ -1050,3 +1060,4 @@ public class SSLSecurity {
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
Loading…
x
Reference in New Issue
Block a user