use new parser for binary
This commit is contained in:
parent
6f16694ed2
commit
0b8be08a54
@ -61,6 +61,15 @@ class SocketParserTest: XCTestCase {
|
|||||||
XCTAssertNil(packet)
|
XCTAssertNil(packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testGenericParser() {
|
||||||
|
var parser = GenericParser(message: "61-/swift,", currentIndex: 0)
|
||||||
|
XCTAssertEqual(parser.read(1), "6")
|
||||||
|
XCTAssertEqual(parser.currentCharacter, "1")
|
||||||
|
XCTAssertEqual(parser.readUntilStringOccurence("-"), "1")
|
||||||
|
XCTAssertEqual(parser.currentCharacter, "-")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func validateParseResult(message:String) {
|
func validateParseResult(message:String) {
|
||||||
let validValues = SocketParserTest.packetTypes[message]!
|
let validValues = SocketParserTest.packetTypes[message]!
|
||||||
let packet = SocketParser.parseString(message)
|
let packet = SocketParser.parseString(message)
|
||||||
|
|||||||
@ -22,6 +22,45 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
struct GenericParser {
|
||||||
|
let message: String
|
||||||
|
var currentIndex:Int
|
||||||
|
var messageCharacters: Array<Character> {
|
||||||
|
get {
|
||||||
|
return Array(message.characters)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var currentCharacter: String? {
|
||||||
|
get{
|
||||||
|
if currentIndex >= messageCharacters.count {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return String(messageCharacters[currentIndex])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func read(characterLength:Int) -> String? {
|
||||||
|
let startIndex = message.startIndex.advancedBy(currentIndex)
|
||||||
|
let range = Range<String.Index>(start: startIndex, end: startIndex.advancedBy(characterLength))
|
||||||
|
currentIndex = currentIndex + characterLength
|
||||||
|
|
||||||
|
return message.substringWithRange(range)
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func readUntilStringOccurence(string:String) -> String? {
|
||||||
|
let startIndex = message.startIndex.advancedBy(currentIndex)
|
||||||
|
let range = Range<String.Index>(start: startIndex, end: message.endIndex)
|
||||||
|
let subString = message.substringWithRange(range) as NSString
|
||||||
|
let foundRange = subString.rangeOfString(string)
|
||||||
|
if foundRange.location == Int.max {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
currentIndex = foundRange.location + 1
|
||||||
|
|
||||||
|
return subString.substringToIndex(foundRange.location)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class SocketParser {
|
class SocketParser {
|
||||||
|
|
||||||
private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
|
private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
|
||||||
@ -73,8 +112,9 @@ class SocketParser {
|
|||||||
|
|
||||||
// Translation of socket.io-client#decodeString
|
// Translation of socket.io-client#decodeString
|
||||||
static func parseString(str: String) -> SocketPacket? {
|
static func parseString(str: String) -> SocketPacket? {
|
||||||
|
var parser = GenericParser(message: str, currentIndex: 0)
|
||||||
let messageCharacters = Array(str.characters)
|
let messageCharacters = Array(str.characters)
|
||||||
guard let type = SocketPacket.PacketType(str: String(messageCharacters[0])) else {
|
guard let typeString = parser.read(1), let type = SocketPacket.PacketType(str: typeString) else {
|
||||||
NSLog("Error parsing \(str)")
|
NSLog("Error parsing \(str)")
|
||||||
return nil}
|
return nil}
|
||||||
|
|
||||||
@ -88,21 +128,14 @@ class SocketParser {
|
|||||||
var placeholders = -1
|
var placeholders = -1
|
||||||
|
|
||||||
if type == .BinaryEvent || type == .BinaryAck {
|
if type == .BinaryEvent || type == .BinaryAck {
|
||||||
var buf = ""
|
if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer) where parser.read(1) == "-" {
|
||||||
|
|
||||||
while messageCharacters[++i] != "-" {
|
|
||||||
buf += String(messageCharacters[i])
|
|
||||||
if i == messageCharacters.count {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let holders = Int(buf) where messageCharacters[i] == "-" {
|
|
||||||
placeholders = holders
|
placeholders = holders
|
||||||
} else {
|
} else {
|
||||||
NSLog("Error parsing \(str)")
|
NSLog("Error parsing \(str)")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i = parser.currentIndex - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if messageCharacters[i + 1] == "/" {
|
if messageCharacters[i + 1] == "/" {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user