[smuxi/stable] Engine-Campfire: split messages on CR instead of trying to parse



commit 3babdd025e98bcff4069b5e738d28f5d67e28886
Author: Carlos Martín Nieto <cmn dwim me>
Date:   Sat Aug 22 02:45:31 2015 +0200

    Engine-Campfire: split messages on CR instead of trying to parse
    
    We currently count the number of braces in order to determine when an
    object definition is done. However, this has all sorts of problems
    around quoting and strings.
    
    It turns out that the server will send a CR as part of the newline it
    sends between each message, which it won't produce inside the objects,
    so we can split the message there and be confident that we're passing a
    full object to the deserializer.

 .../Protocols/Campfire/CampfireEventStream.cs      |   42 +++++++------------
 1 files changed, 16 insertions(+), 26 deletions(-)
---
diff --git a/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs 
b/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
index 6514d5c..8758913 100644
--- a/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
+++ b/src/Engine-Campfire/Protocols/Campfire/CampfireEventStream.cs
@@ -140,37 +140,27 @@ namespace Smuxi.Engine
 
             using (StreamReader reader = new StreamReader(res.GetResponseStream()))
             {
-                /* Stupid but easy way to figure out when we've reached the end of a JSON object */
-                int brackets = 0;
                 StringBuilder bld = new StringBuilder();
 
                 while (!reader.EndOfStream) {
-                    var line = reader.ReadLine();
-
-                    for (int i = 0; i < line.Length; i++) {
-                        bld.Append(line[i]);
-                        switch (line[i]) {
-                            case '{':
-                                brackets++;
-                                break;
-                            case '}':
-                                brackets--;
-                                break;
-                            default:
-                                continue;
-                        }
+                    var c = reader.Read();
 
-                        if (brackets == 0) {
-                            var str = bld.ToString().Trim();
-                            bld.Length = 0;
-                            var message = JsonSerializer.DeserializeFromString<Message>(str);
-                            if (MessageReceived != null) {
-                                var args = new MessageReceivedEventArgs(Chat, message);
-                                MessageReceived(this, args);
-                            }
-                            LastMessage = message.Id;
-                        }
+                    /* The server uses CR to indicate when each message ends */
+                    if (c != '\r') {
+                        bld.Append((char)c);
+                        continue;
                     }
+
+                    var str = bld.ToString();
+                    bld.Length = 0;
+
+                    var message = JsonSerializer.DeserializeFromString<Message>(str);
+                    if (MessageReceived != null) {
+                        var args = new MessageReceivedEventArgs(Chat, message);
+                        MessageReceived(this, args);
+                    }
+
+                    LastMessage = message.Id;
                 }
 
                 reader.Close();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]