From c7ac3aeaae88d4a05668f033702975924fd38ce8 Mon Sep 17 00:00:00 2001 From: Matt Irvine Date: Tue, 24 Jul 2018 09:37:08 -0700 Subject: [PATCH] Fix bug where strings that looked like dates were transformed when reading messages (#663) * Do not try to parse dates when reading messages * Add test --- .../Hosting/Protocol/MessageReader.cs | 5 +++- .../Messaging/MessageReaderTests.cs | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs index 876b39d7..42eb9d7d 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs @@ -12,6 +12,7 @@ using Microsoft.SqlTools.Hosting; using Microsoft.SqlTools.Hosting.Protocol.Contracts; using Microsoft.SqlTools.Hosting.Protocol.Serializers; using Microsoft.SqlTools.Utility; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Microsoft.SqlTools.Hosting.Protocol @@ -110,7 +111,9 @@ namespace Microsoft.SqlTools.Hosting.Protocol ShiftBufferBytesAndShrink(readOffset); // Get the JObject for the JSON content - JObject messageObject = JObject.Parse(messageContent); + JsonReader messageReader = new JsonTextReader(new StringReader(messageContent)); + messageReader.DateParseHandling = DateParseHandling.None; + JObject messageObject = JObject.Load(messageReader); // Return the parsed message return this.messageSerializer.DeserializeMessage(messageObject); diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageReaderTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageReaderTests.cs index 10705299..2fa31cfd 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageReaderTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageReaderTests.cs @@ -220,6 +220,31 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Messaging inputStream.Dispose(); } + [Fact] + public void ReaderDoesNotModifyDateStrings() + { + MemoryStream inputStream = new MemoryStream(); + MessageReader messageReader = + new MessageReader( + inputStream, + this.messageSerializer); + + string dateString = "2018-04-27T18:33:55.870Z"; + + // Get a message with content that is a date as a string + byte[] messageBuffer = this.GetMessageBytes( + string.Format(Common.TestEventFormatString, dateString)); + + inputStream.Write(messageBuffer, 0, messageBuffer.Length); + inputStream.Flush(); + inputStream.Seek(0, SeekOrigin.Begin); + + Message messageResult = messageReader.ReadMessage().Result; + Assert.Equal(dateString, messageResult.Contents.Value("someString")); + + inputStream.Dispose(); + } + private byte[] GetMessageBytes(string messageString, Encoding encoding = null) { if (encoding == null)