40 lines
1.3 KiB
C#
40 lines
1.3 KiB
C#
using System;
|
|
using NuGet.Protocol.Plugins;
|
|
|
|
namespace NugetSecretCredential;
|
|
|
|
internal abstract class RequestHandlerBase<TRequest, TResponse> : 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<TRequest>(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<TResponse> HandleRequestAsync(TRequest request, CancellationToken cancel);
|
|
|
|
protected virtual AutomaticProgressReporter? GetProgressReporter(IConnection connection, Message message, CancellationToken cancel)
|
|
{
|
|
return null;
|
|
}
|
|
} |