private async Task ProcessMessage(FtpCommand command)
{
FtpResponse response;
Log?.Trace(command);
var result = FindCommandHandler(command);
if (result != null)
{
var handler = result.Item2;
var handlerCommand = result.Item1;
var isLoginRequired = result.Item3;
if (isLoginRequired && !Data.IsLoggedIn)
{
response = new FtpResponse(530, "Not logged in.");
}
else
{
try
{
var cmdHandler = handler as FtpCommandHandler;
var isAbortable = cmdHandler?.IsAbortable ?? false;
if (isAbortable)
{
var newBackgroundTask = Data.BackgroundCommandHandler.Execute(handler, handlerCommand);
if (newBackgroundTask != null)
{
_activeBackgroundTask = newBackgroundTask;
response = null;
}
else
{
response = new FtpResponse(503, "Parallel commands aren't allowed.");
}
}
else
{
response = await handler.Process(handlerCommand, _cancellationTokenSource.Token);
}
}
catch (Exception ex)
{
Log?.Error(ex, "Failed to process message ({0})", command);
response = new FtpResponse(501, "Syntax error in parameters or arguments.");
}
}
}
else
{
response = new FtpResponse(500, "Syntax error, command unrecognized.");
}
if (response != null)
await WriteAsync(response, _cancellationTokenSource.Token);
}