nuget-extensions/nuget-plugin/RequestHandlers/RequestHandlerBase.cs (38 lines of code) (raw):
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using NuGet.Common;
using NuGet.Protocol.Plugins;
using ILogger = JetBrains.TeamCity.NuGet.Logging.ILogger;
namespace JetBrains.TeamCity.NuGet.RequestHandlers
{
internal abstract class RequestHandlerBase<TRequest, TResponse> : IRequestHandler where TResponse : class
{
private readonly JsonSerializerSettings _serializerSettings;
protected RequestHandlerBase(ILogger logger)
{
Logger = logger;
_serializerSettings = new JsonSerializerSettings {Formatting = Formatting.None};
_serializerSettings.Converters.Add(new StringEnumConverter());
}
/// <summary>
/// Gets the current <see cref="ILogger"/> to use for logging.
/// </summary>
protected ILogger Logger { get; }
/// <summary>
/// Gets a <see cref="CancellationToken"/> to use.
/// </summary>
public virtual CancellationToken CancellationToken { get; private set; } = CancellationToken.None;
public async Task HandleResponseAsync(IConnection connection, Message message, IResponseHandler responseHandler,
CancellationToken cancellationToken)
{
TRequest request = MessageUtilities.DeserializePayload<TRequest>(message);
var requestType = message.Type.ToString().ToLower();
Logger.Log(LogLevel.Debug, string.Format("Handling {0} '{1}': {2}", requestType, message.Method, message.Payload.ToString(Formatting.None)));
TResponse response = await HandleRequestAsync(request).ConfigureAwait(false);
// We don't want to print credentials on auth responses
if (message.Method != MessageMethod.GetAuthenticationCredentials)
{
var logResponse = JsonConvert.SerializeObject(response, _serializerSettings);
Logger.Log(LogLevel.Debug, string.Format("Sending response: {0}", logResponse));
}
await responseHandler.SendResponseAsync(message, response, cancellationToken).ConfigureAwait(false);
CancellationToken = CancellationToken.None;
}
public abstract Task<TResponse> HandleRequestAsync(TRequest request);
}
}