diff --git a/Content.Server/UtkaIntegration/TCP/UtkaTCPServer.cs b/Content.Server/UtkaIntegration/TCP/UtkaTCPServer.cs index 11263e1127..d56204675f 100644 --- a/Content.Server/UtkaIntegration/TCP/UtkaTCPServer.cs +++ b/Content.Server/UtkaIntegration/TCP/UtkaTCPServer.cs @@ -44,7 +44,9 @@ public sealed class UtkaTCPServer : TcpServer { if(!session.Authenticated) continue; - session.SendAsync(JsonSerializer.Serialize(message, message.GetType())); + var json = JsonSerializer.Serialize(message, message.GetType()); + + session.SendAsync(json + "&%^sep^%&"); } } diff --git a/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs b/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs index 681e1f1eca..47d28c09fa 100644 --- a/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs +++ b/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs @@ -72,24 +72,32 @@ public sealed class UtkaTCPSession : TcpSession protected override void OnDisconnected() { - base.OnDisconnecting(); + OnDisconnecting(); Dispose(); BufferCahce = string.Empty; } private void HandleCache() { - var regex = new Regex("{.+?}"); - var matches = regex.Matches(BufferCahce); + var handles = BufferCahce.Split("&%^sep^%&"); - foreach (Match match in matches) + for (var i = 0; i < handles.Length; i++) { - var pos = BufferCahce.IndexOf(match.Value); - BufferCahce = BufferCahce.Substring(0, pos) + BufferCahce.Substring(pos + match.Value.Length); + var handle = handles[i]; - if (!ValidateMessage(match.Value, out var message)) + if (i + 1 == handles.Length && !BufferCahce.EndsWith("&%^sep^%&")) + continue; + + if (handle.Length == 0 || !handle.StartsWith("{\"") || !handle.EndsWith("\"}")) + continue; + + var pos = BufferCahce.IndexOf(handle); + + BufferCahce = BufferCahce.Substring(0, pos) + BufferCahce.Substring(pos + handle.Length + "&%^sep^%&".Length); + + if (!ValidateMessage(handle, out var message)) { - this.SendAsync("Validation fail"); + SendAsync("Validation fail"); return; }