diff --git a/src/NATS.Server/ClientFlags.cs b/src/NATS.Server/ClientFlags.cs index 8f9e915..49818d6 100644 --- a/src/NATS.Server/ClientFlags.cs +++ b/src/NATS.Server/ClientFlags.cs @@ -15,6 +15,7 @@ public enum ClientFlags WriteLoopStarted = 1 << 4, IsSlowConsumer = 1 << 5, ConnectProcessFinished = 1 << 6, + TraceMode = 1 << 7, } /// diff --git a/src/NATS.Server/NatsClient.cs b/src/NATS.Server/NatsClient.cs index 1ccfc71..5a7e2c8 100644 --- a/src/NATS.Server/NatsClient.cs +++ b/src/NATS.Server/NatsClient.cs @@ -54,6 +54,20 @@ public sealed class NatsClient : IDisposable public bool ConnectReceived => _flags.HasFlag(ClientFlags.ConnectReceived); public ClientClosedReason CloseReason { get; private set; } + public void SetTraceMode(bool enabled) + { + if (enabled) + { + _flags.SetFlag(ClientFlags.TraceMode); + _parser.Logger = _logger; + } + else + { + _flags.ClearFlag(ClientFlags.TraceMode); + _parser.Logger = _options.Trace ? _logger : null; + } + } + public DateTime StartTime { get; } private long _lastActivityTicks; public DateTime LastActivity => new(Interlocked.Read(ref _lastActivityTicks), DateTimeKind.Utc); diff --git a/src/NATS.Server/Protocol/NatsParser.cs b/src/NATS.Server/Protocol/NatsParser.cs index b9debdd..7ba0aad 100644 --- a/src/NATS.Server/Protocol/NatsParser.cs +++ b/src/NATS.Server/Protocol/NatsParser.cs @@ -36,7 +36,8 @@ public sealed class NatsParser { private static readonly byte[] CrLfBytes = "\r\n"u8.ToArray(); private readonly int _maxPayload; - private readonly ILogger? _logger; + private ILogger? _logger; + public ILogger? Logger { set => _logger = value; } // State for split-packet payload reading private bool _awaitingPayload; diff --git a/tests/NATS.Server.Tests/ClientTraceModeTests.cs b/tests/NATS.Server.Tests/ClientTraceModeTests.cs new file mode 100644 index 0000000..20e1660 --- /dev/null +++ b/tests/NATS.Server.Tests/ClientTraceModeTests.cs @@ -0,0 +1,15 @@ +namespace NATS.Server.Tests; + +public class ClientTraceModeTests +{ + [Fact] + public void TraceMode_flag_can_be_set_and_cleared() + { + var holder = new ClientFlagHolder(); + holder.HasFlag(ClientFlags.TraceMode).ShouldBeFalse(); + holder.SetFlag(ClientFlags.TraceMode); + holder.HasFlag(ClientFlags.TraceMode).ShouldBeTrue(); + holder.ClearFlag(ClientFlags.TraceMode); + holder.HasFlag(ClientFlags.TraceMode).ShouldBeFalse(); + } +}