diff --git a/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs b/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs index 8a272fa6fef..2d31d866521 100644 --- a/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs +++ b/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs @@ -51,32 +51,7 @@ private static async Task Egress(Action(payloadBuffer); + ExtensionEgressPayload configPayload = await GetPayload(token); ServiceCollection services = CreateServices(configPayload, configureServices); @@ -115,6 +90,38 @@ private static async Task Egress(Action GetPayload(CancellationToken token) + { + StdInStream = Console.OpenStandardInput(); + + int dotnetMonitorPayloadProtocolVersion; + long payloadLengthBuffer; + byte[] payloadBuffer; + + using (BinaryReader reader = new BinaryReader(StdInStream, Encoding.UTF8, leaveOpen: true)) + { + dotnetMonitorPayloadProtocolVersion = reader.ReadInt32(); + if (dotnetMonitorPayloadProtocolVersion != ExpectedPayloadProtocolVersion) + { + throw new EgressException(string.Format(CultureInfo.CurrentCulture, Strings.ErrorMessage_IncorrectPayloadVersion, dotnetMonitorPayloadProtocolVersion, ExpectedPayloadProtocolVersion)); + } + + payloadLengthBuffer = reader.ReadInt64(); + + if (payloadLengthBuffer < 0) + { + throw new ArgumentOutOfRangeException(nameof(payloadLengthBuffer)); + } + } + + payloadBuffer = new byte[payloadLengthBuffer]; + await ReadExactlyAsync(payloadBuffer, token); + + ExtensionEgressPayload configPayload = JsonSerializer.Deserialize(payloadBuffer); + + return configPayload; + } + private static ServiceCollection CreateServices(ExtensionEgressPayload payload, Action configureServices) where TOptions : class, new() { @@ -161,7 +168,7 @@ private static async Task GetStream(Stream outputStream, CancellationToken cance await StdInStream.CopyToAsync(outputStream, DefaultBufferSize, cancellationToken); } - private static async Task ReadExactlyAsync(Memory buffer, CancellationToken token) + internal static async Task ReadExactlyAsync(Memory buffer, CancellationToken token) { #if NET7_0_OR_GREATER await StdInStream.ReadExactlyAsync(buffer, token); diff --git a/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj b/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj index 884fac52da1..2c0e3776639 100644 --- a/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj +++ b/src/Extensions/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj @@ -20,6 +20,7 @@ + diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp.csproj b/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp.csproj index 71e2a0f7f9b..8f5f2f94fe2 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp.csproj +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp.csproj @@ -18,6 +18,7 @@ + diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Program.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Program.cs index e47a7c83607..ba825ccaed4 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Program.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp/Program.cs @@ -2,11 +2,13 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.Diagnostics.Monitoring.Tool.UnitTests; -using Microsoft.Diagnostics.Tools.Monitor.Egress; +using Microsoft.Diagnostics.Monitoring.Extension.Common; using Microsoft.Extensions.Configuration; using System; using System.CommandLine; using System.Text.Json; +using System.Threading.Tasks; +using System.Threading; using Xunit; namespace Microsoft.Diagnostics.Monitoring.EgressExtensibilityApp @@ -19,21 +21,19 @@ static int Main(string[] args) CliCommand egressCmd = new CliCommand("Egress"); - egressCmd.SetAction(Egress); + egressCmd.SetAction((result, token) => Egress(token)); rootCommand.Add(egressCmd); return rootCommand.Parse(args).Invoke(); } - private static int Egress(ParseResult parseResult) + private static async Task Egress(CancellationToken token) { EgressArtifactResult result = new(); try { - string jsonConfig = Console.ReadLine(); - - ExtensionEgressPayload configPayload = JsonSerializer.Deserialize(jsonConfig); + ExtensionEgressPayload configPayload = await EgressHelper.GetPayload(token); TestEgressProviderOptions options = BuildOptions(configPayload); Assert.Single(options.Metadata.Keys); diff --git a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EgressExtensibilityTests.cs b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EgressExtensibilityTests.cs index e22ba1ee4d3..be07e4d00a2 100644 --- a/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EgressExtensibilityTests.cs +++ b/src/Tests/Microsoft.Diagnostics.Monitoring.Tool.UnitTests/EgressExtensibilityTests.cs @@ -19,6 +19,7 @@ namespace Microsoft.Diagnostics.Monitoring.Tool.UnitTests { + [TargetFrameworkMonikerTrait(TargetFrameworkMonikerExtensions.CurrentTargetFrameworkMoniker)] public sealed class EgressExtensibilityTests { private ITestOutputHelper _outputHelper;