Skip to content

Commit 89ae9bd

Browse files
committed
handle utf8 in polling better
1 parent c67e7a3 commit 89ae9bd

File tree

2 files changed

+15
-74
lines changed

2 files changed

+15
-74
lines changed

SwiftIO/SocketEngine.swift

+7-3
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,9 @@ public class SocketEngine: NSObject, WebSocketDelegate {
406406

407407
private func parseEngineMessage(var message:String) {
408408
// NSLog("Engine got message: \(message)")
409-
fixDoubleUTF8(&message)
409+
if self.polling {
410+
fixDoubleUTF8(&message)
411+
}
410412

411413
// We should upgrade
412414
if message == "3probe" {
@@ -500,9 +502,11 @@ public class SocketEngine: NSObject, WebSocketDelegate {
500502
}
501503
}
502504

503-
private func sendPollMessage(msg:String, withType type:PacketType,
505+
private func sendPollMessage(var msg:String, withType type:PacketType,
504506
datas:[NSData]? = nil) {
505507
// println("Sending poll: \(msg) as type: \(type.rawValue)")
508+
509+
doubleEncodeUTF8(&msg)
506510
let strMsg = "\(type.rawValue)\(msg)"
507511

508512
self.postWait.append(strMsg)
@@ -584,4 +588,4 @@ public class SocketEngine: NSObject, WebSocketDelegate {
584588
public func websocketDidReceiveData(socket:WebSocket, data:NSData) {
585589
self.parseEngineData(data)
586590
}
587-
}
591+
}

SwiftIO/SocketFixUTF8.swift

+8-71
Original file line numberDiff line numberDiff line change
@@ -21,80 +21,17 @@
2121
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2222
// THE SOFTWARE.
2323
//
24-
// Adapted from: https://github.com/durbrow/fix-double-utf8.swift
2524

2625
import Foundation
2726

28-
var memoizer = [String: UnicodeScalar]()
29-
30-
func lookup(base:UnicodeScalar, combi:UnicodeScalar) -> UnicodeScalar {
31-
let combined = "\(base)\(combi)"
32-
33-
if let y = memoizer[combined] {
34-
return y
35-
}
36-
37-
for i in 0x80...0xFF {
38-
let ch = UnicodeScalar(i)
39-
40-
if String(ch) == combined {
41-
memoizer[combined] = ch
42-
return ch
43-
}
44-
}
45-
let ch = UnicodeScalar(0xFFFD) // Unicode replacement character �
46-
47-
memoizer[combined] = ch
48-
return ch
27+
func fixDoubleUTF8(inout name:String) {
28+
let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)!
29+
let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)!
30+
name = latin1 as String
4931
}
5032

51-
func fixDoubleUTF8(inout name:String) {
52-
var isASCII = true
53-
var y = [UInt8]()
54-
55-
for ch in name.unicodeScalars {
56-
if ch.value < 0x80 {
57-
y.append(UInt8(ch))
58-
continue
59-
}
60-
isASCII = false
61-
62-
if ch.value < 0x100 {
63-
y.append(UInt8(ch))
64-
continue
65-
}
66-
// might be a combining character that when combined with the
67-
// preceeding character maps to a codepoint in the UTF8 range
68-
if y.count == 0 {
69-
return
70-
}
71-
72-
let last = y.removeLast()
73-
let repl = lookup(UnicodeScalar(last), ch)
74-
75-
// the replacement needs to be in the UTF8 range
76-
if repl.value >= 0x100 {
77-
return
78-
}
79-
80-
y.append(UInt8(repl))
81-
}
82-
83-
if isASCII {
84-
return
85-
}
86-
87-
y.append(0) // null terminator
88-
89-
return y.withUnsafeBufferPointer {
90-
let cstr = UnsafePointer<CChar>($0.baseAddress) // typecase from uint8_t * to char *
91-
let rslt = String.fromCStringRepairingIllFormedUTF8(cstr) // -> (String, Bool)
92-
if let str = rslt.0 {
93-
if !rslt.hadError {
94-
name = str
95-
}
96-
}
97-
98-
return
99-
}
33+
func doubleEncodeUTF8(inout str:String) {
34+
let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)!
35+
let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)!
36+
str = utf8 as String
10037
}

0 commit comments

Comments
 (0)