Skip to content

Commit 033a509

Browse files
committed
Merge branch 'development'
* development: Update readme to reflect that 10.0+ only support socket.io 2.0+ Remove more doubleEncode stuff Remove doubleEncodeUTF8 from NSDictionary translation Fix unicode for socket.io 2.0 Use guard statements in polling More Objective-c tests Use Data instead of NSData code style Make addHeaders inout
2 parents da5b019 + df3d7ae commit 033a509

12 files changed

+156
-157
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{
5151
```
5252
5353
## Features
54-
- Supports socket.io 1.0+
54+
- Supports socket.io 2.0+ (For socket.io 1.0 use v9.x)
5555
- Supports binary
5656
- Supports Polling and WebSockets
5757
- Supports TLS/SSL

SocketIO-MacTests/SocketEngineTest.swift

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,73 +17,75 @@ class SocketEngineTest: XCTestCase {
1717
super.setUp()
1818
client = SocketIOClient(socketURL: URL(string: "http://localhost")!)
1919
engine = SocketEngine(client: client, url: URL(string: "http://localhost")!, options: nil)
20-
20+
2121
client.setTestable()
2222
}
23-
23+
2424
func testBasicPollingMessage() {
2525
let expect = expectation(description: "Basic polling test")
2626
client.on("blankTest") {data, ack in
2727
expect.fulfill()
2828
}
29-
29+
3030
engine.parsePollingMessage("15:42[\"blankTest\"]")
3131
waitForExpectations(timeout: 3, handler: nil)
3232
}
33-
33+
3434
func testTwoPacketsInOnePollTest() {
3535
let finalExpectation = expectation(description: "Final packet in poll test")
3636
var gotBlank = false
37-
37+
3838
client.on("blankTest") {data, ack in
3939
gotBlank = true
4040
}
41-
41+
4242
client.on("stringTest") {data, ack in
4343
if let str = data[0] as? String, gotBlank {
4444
if str == "hello" {
4545
finalExpectation.fulfill()
4646
}
4747
}
4848
}
49-
49+
5050
engine.parsePollingMessage("15:42[\"blankTest\"]24:42[\"stringTest\",\"hello\"]")
5151
waitForExpectations(timeout: 3, handler: nil)
5252
}
53-
53+
5454
func testEngineDoesErrorOnUnknownTransport() {
5555
let finalExpectation = expectation(description: "Unknown Transport")
56-
56+
5757
client.on("error") {data, ack in
5858
if let error = data[0] as? String, error == "Unknown transport" {
5959
finalExpectation.fulfill()
6060
}
6161
}
62-
63-
engine.parseEngineMessage("{\"code\": 0, \"message\": \"Unknown transport\"}", fromPolling: false)
62+
63+
engine.parseEngineMessage("{\"code\": 0, \"message\": \"Unknown transport\"}")
6464
waitForExpectations(timeout: 3, handler: nil)
6565
}
66-
66+
6767
func testEngineDoesErrorOnUnknownMessage() {
6868
let finalExpectation = expectation(description: "Engine Errors")
69-
69+
7070
client.on("error") {data, ack in
7171
finalExpectation.fulfill()
7272
}
73-
74-
engine.parseEngineMessage("afafafda", fromPolling: false)
73+
74+
engine.parseEngineMessage("afafafda")
7575
waitForExpectations(timeout: 3, handler: nil)
7676
}
77-
77+
7878
func testEngineDecodesUTF8Properly() {
7979
let expect = expectation(description: "Engine Decodes utf8")
80-
80+
8181
client.on("stringTest") {data, ack in
82-
XCTAssertEqual(data[0] as? String, "lïne one\nlīne \rtwo", "Failed string test")
82+
XCTAssertEqual(data[0] as? String, "lïne one\nlīne \rtwo𦅙𦅛", "Failed string test")
8383
expect.fulfill()
8484
}
8585

86-
engine.parsePollingMessage("41:42[\"stringTest\",\"lïne one\\nlīne \\rtwo\"]")
86+
let stringMessage = "42[\"stringTest\",\"lïne one\\nlīne \\rtwo𦅙𦅛\"]"
87+
88+
engine.parsePollingMessage("\(stringMessage.utf16.count):\(stringMessage)")
8789
waitForExpectations(timeout: 3, handler: nil)
8890
}
8991

@@ -102,23 +104,23 @@ class SocketEngineTest: XCTestCase {
102104
XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D")
103105
XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D")
104106
}
105-
107+
106108
func testBase64Data() {
107109
let expect = expectation(description: "Engine Decodes base64 data")
108110
let b64String = "b4aGVsbG8NCg=="
109111
let packetString = "451-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0}}]"
110-
112+
111113
client.on("test") {data, ack in
112114
if let data = data[0] as? Data, let string = String(data: data, encoding: .utf8) {
113115
XCTAssertEqual(string, "hello")
114116
}
115-
117+
116118
expect.fulfill()
117119
}
118-
119-
engine.parseEngineMessage(packetString, fromPolling: false)
120-
engine.parseEngineMessage(b64String, fromPolling: false)
121-
120+
121+
engine.parseEngineMessage(packetString)
122+
engine.parseEngineMessage(b64String)
123+
122124
waitForExpectations(timeout: 3, handler: nil)
123125
}
124126
}

SocketIO-MacTests/SocketObjectiveCTest.m

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
// Merely tests whether the Objective-C api breaks
88
//
99

10-
#import <XCTest/XCTest.h>
10+
@import Dispatch;
11+
@import Foundation;
12+
@import XCTest;
1113
@import SocketIO;
1214

1315
@interface SocketObjectiveCTest : XCTestCase
@@ -24,20 +26,66 @@ - (void)setUp {
2426
self.socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @NO, @"forcePolling": @YES}];
2527
}
2628

29+
- (void)testProperties {
30+
NSURL* url = nil;
31+
32+
url = self.socket.socketURL;
33+
self.socket.forceNew = false;
34+
self.socket.handleQueue = dispatch_get_main_queue();
35+
self.socket.nsp = @"/objective-c";
36+
self.socket.reconnects = false;
37+
self.socket.reconnectWait = 1;
38+
}
39+
2740
- (void)testOnSyntax {
2841
[self.socket on:@"someCallback" callback:^(NSArray* data, SocketAckEmitter* ack) {
2942
[ack with:@[@1]];
3043
}];
3144
}
3245

46+
- (void)testConnectSyntax {
47+
[self.socket connect];
48+
}
49+
50+
- (void)testConnectTimeoutAfterSyntax {
51+
[self.socket connectWithTimeoutAfter:1 withHandler: ^() { }];
52+
}
53+
54+
- (void)testDisconnectSyntax {
55+
[self.socket disconnect];
56+
}
57+
58+
- (void)testLeaveNamespaceSyntax {
59+
[self.socket leaveNamespace];
60+
}
61+
62+
- (void)testJoinNamespaceSyntax {
63+
[self.socket joinNamespace:@"/objective-c"];
64+
}
65+
66+
- (void)testOnAnySyntax {
67+
[self.socket onAny:^(SocketAnyEvent* any) {
68+
NSString* event = any.event;
69+
NSArray* data = any.items;
70+
71+
[self.socket emit:event with:data];
72+
}];
73+
}
74+
75+
- (void)testReconnectSyntax {
76+
[self.socket reconnect];
77+
}
78+
79+
- (void)testRemoveAllHandlersSyntax {
80+
[self.socket removeAllHandlers];
81+
}
82+
3383
- (void)testEmitSyntax {
3484
[self.socket emit:@"testEmit" with:@[@YES]];
3585
}
3686

3787
- (void)testEmitWithAckSyntax {
38-
[[self.socket emitWithAck:@"testAckEmit" with:@[@YES]] timingOutAfter:0 callback:^(NSArray* data) {
39-
40-
}];
88+
[[self.socket emitWithAck:@"testAckEmit" with:@[@YES]] timingOutAfter:0 callback:^(NSArray* data) { }];
4189
}
4290

4391
- (void)testOffSyntax {

Source/SocketEngine.swift

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll
6666
/// An array of HTTPCookies that are sent during the connection.
6767
public private(set) var cookies: [HTTPCookie]?
6868

69-
/// Set to `true` if using the node.js version of socket.io. The node.js version of socket.io
70-
/// handles utf8 incorrectly.
71-
public private(set) var doubleEncodeUTF8 = true
72-
7369
/// A dictionary of extra http headers that will be set during connection.
7470
public private(set) var extraHeaders: [String: String]?
7571

@@ -153,8 +149,6 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll
153149
connectParams = params
154150
case let .cookies(cookies):
155151
self.cookies = cookies
156-
case let .doubleEncodeUTF8(encode):
157-
doubleEncodeUTF8 = encode
158152
case let .extraHeaders(headers):
159153
extraHeaders = headers
160154
case let .sessionDelegate(delegate):
@@ -227,8 +221,8 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll
227221
// binary in base64 string
228222
let noPrefix = message[message.index(message.startIndex, offsetBy: 2)..<message.endIndex]
229223

230-
if let data = NSData(base64Encoded: noPrefix, options: .ignoreUnknownCharacters) {
231-
client?.parseEngineBinaryData(data as Data)
224+
if let data = Data(base64Encoded: noPrefix, options: .ignoreUnknownCharacters) {
225+
client?.parseEngineBinaryData(data)
232226
}
233227
}
234228

@@ -511,11 +505,10 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll
511505
/// - parameter message: The message to parse.
512506
/// - parameter fromPolling: Whether this message is from long-polling.
513507
/// If `true` we might have to fix utf8 encoding.
514-
public func parseEngineMessage(_ message: String, fromPolling: Bool) {
508+
public func parseEngineMessage(_ message: String) {
515509
DefaultSocketLogger.Logger.log("Got message: %@", type: logType, args: message)
516510

517511
let reader = SocketStringReader(message: message)
518-
let fixedString: String
519512

520513
if message.hasPrefix("b4") {
521514
return handleBase64(message: message)
@@ -527,23 +520,17 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll
527520
return
528521
}
529522

530-
if fromPolling && type != .noop && doubleEncodeUTF8 {
531-
fixedString = fixDoubleUTF8(message)
532-
} else {
533-
fixedString = message
534-
}
535-
536523
switch type {
537524
case .message:
538-
handleMessage(String(fixedString.characters.dropFirst()))
525+
handleMessage(String(message.characters.dropFirst()))
539526
case .noop:
540527
handleNOOP()
541528
case .pong:
542-
handlePong(with: fixedString)
529+
handlePong(with: message)
543530
case .open:
544-
handleOpen(openData: String(fixedString.characters.dropFirst()))
531+
handleOpen(openData: String(message.characters.dropFirst()))
545532
case .close:
546-
handleClose(fixedString)
533+
handleClose(message)
547534
default:
548535
DefaultSocketLogger.Logger.log("Got unknown packet type", type: logType)
549536
}
@@ -643,17 +630,19 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll
643630
return
644631
}
645632

646-
if websocket {
647-
connected = false
648-
websocket = false
633+
guard websocket else {
634+
flushProbeWait()
649635

650-
if let reason = error?.localizedDescription {
651-
didError(reason: reason)
652-
} else {
653-
client?.engineDidClose(reason: "Socket Disconnected")
654-
}
636+
return
637+
}
638+
639+
connected = false
640+
websocket = false
641+
642+
if let reason = error?.localizedDescription {
643+
didError(reason: reason)
655644
} else {
656-
flushProbeWait()
645+
client?.engineDidClose(reason: "Socket Disconnected")
657646
}
658647
}
659648
}

0 commit comments

Comments
 (0)