From 1f6b2a0cf2f64c97e6be5f5d0aa65dbcfa2734c4 Mon Sep 17 00:00:00 2001 From: Jack Schaffner Date: Fri, 21 Jun 2024 11:07:11 -0700 Subject: [PATCH] Buffer Unity SDK ReceiveData when watching GameServer configuration changes. (#3872) --- sdks/unity/AgonesSdk.cs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/sdks/unity/AgonesSdk.cs b/sdks/unity/AgonesSdk.cs index f040ea31de..a02cede35f 100644 --- a/sdks/unity/AgonesSdk.cs +++ b/sdks/unity/AgonesSdk.cs @@ -360,17 +360,37 @@ private void OnRequestCompleted(AsyncOperation _) private class GameServerHandler : DownloadHandlerScript { private WatchGameServerCallback callback; + private StringBuilder stringBuilder; + public GameServerHandler(WatchGameServerCallback callback) { this.callback = callback; + this.stringBuilder = new StringBuilder(); } protected override bool ReceiveData(byte[] data, int dataLength) { - string json = Encoding.UTF8.GetString(data); - var dictionary = (Dictionary) Json.Deserialize(json); - var gameServer = new GameServer(dictionary["result"] as Dictionary); - this.callback(gameServer); + string dataString = Encoding.UTF8.GetString(data); + this.stringBuilder.Append(dataString); + + string bufferString = stringBuilder.ToString(); + int newlineIndex; + + while ((newlineIndex = bufferString.IndexOf('\n')) >= 0) + { + string fullLine = bufferString.Substring(0, newlineIndex); + try + { + var dictionary = (Dictionary) Json.Deserialize(fullLine); + var gameServer = new GameServer(dictionary["result"] as Dictionary); + this.callback(gameServer); + } + catch (Exception ignore) {} // Ignore parse errors + bufferString = bufferString.Substring(newlineIndex + 1); + } + + stringBuilder.Clear(); + stringBuilder.Append(bufferString); return true; } }