Don't parse twice for errors

This commit is contained in:
Erik 2016-09-02 18:03:15 -04:00
parent 49dfd7432c
commit 16eefa4abf
No known key found for this signature in database
GPG Key ID: 4930B7C5FBC1A69D
2 changed files with 15 additions and 11 deletions

View File

@ -27,7 +27,8 @@ class SocketParserTest: XCTestCase {
"1/swift": ("/swift", [], [], -1),
"4\"ERROR\"": ("/", ["ERROR"], [], -1),
"4{\"test\":2}": ("/", [["test": 2]], [], -1),
"41": ("/", [1], [], -1)]
"41": ("/", [1], [], -1),
"4[1, \"hello\"]": ("/", [1, "hello"], [], -1)]
func testDisconnect() {
let message = "1"
@ -99,6 +100,11 @@ class SocketParserTest: XCTestCase {
validateParseResult(message)
}
func testErrorTypeArray() {
let message = "4[1, \"hello\"]"
validateParseResult(message)
}
func testInvalidInput() {
let message = "8"
switch testSocket.parseString(message) {
@ -120,7 +126,7 @@ class SocketParserTest: XCTestCase {
func validateParseResult(message: String) {
let validValues = SocketParserTest.packetTypes[message]!
let packet = testSocket.parseString(message)
let type = message.substringWithRange(Range<String.Index>(message.startIndex..<message.startIndex.advancedBy(1)))
let type = String(message.characters.prefixUpTo(message.startIndex.advancedBy(1)))
if case let .Right(packet) = packet {
XCTAssertEqual(packet.type, SocketPacket.PacketType(rawValue: Int(type) ?? -1)!)
XCTAssertEqual(packet.nsp, validValues.0)

View File

@ -107,17 +107,15 @@ extension SocketParsable {
}
}
let d = message[reader.currentIndex.advancedBy(1)..<message.endIndex]
var dataArray = message[reader.currentIndex.advancedBy(1)..<message.endIndex]
switch parseData(d) {
if type == .Error && !dataArray.hasPrefix("[") && !dataArray.hasSuffix("]") {
dataArray = "[" + dataArray + "]"
}
switch parseData(dataArray) {
case let .Left(err):
// Errors aren't always enclosed in an array
if case let .Right(data) = parseData("\([d as AnyObject])") {
return .Right(SocketPacket(type: type, data: data, id: Int(idString) ?? -1,
nsp: namespace, placeholders: placeholders))
} else {
return .Left(err)
}
return .Left(err)
case let .Right(data):
return .Right(SocketPacket(type: type, data: data, id: Int(idString) ?? -1,
nsp: namespace, placeholders: placeholders))