using System; using NuGet.Protocol.Plugins; namespace NugetSecretCredential; internal abstract class RequestHandlerBase : IRequestHandler where TResponse : class { protected RequestHandlerBase() { } CancellationToken IRequestHandler.CancellationToken => default; public IConnection? Connection { get; private set; } public virtual CancellationToken CancellationToken { get; private set; } = CancellationToken.None; public async Task HandleResponseAsync(IConnection connection, Message message, IResponseHandler responseHandler, CancellationToken cancel) { Connection = connection; TRequest request = MessageUtilities.DeserializePayload(message); TResponse? response = null; using (GetProgressReporter(connection, message, cancel)) { response = await HandleRequestAsync(request, cancel); } // If we did not send a cancel message, we must submit the response even if cancellationToken is canceled. await responseHandler.SendResponseAsync(message, response, CancellationToken.None); } public abstract Task HandleRequestAsync(TRequest request, CancellationToken cancel); protected virtual AutomaticProgressReporter? GetProgressReporter(IConnection connection, Message message, CancellationToken cancel) { return null; } }