/// <inheritdoc/> public override async Task <IFtpResponse> Process(FtpCommand command, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(command.Argument)) { var taskStates = _backgroundTransferWorker.GetStates(); var statusMessage = new StringBuilder(); statusMessage.AppendFormat( "Server functional, {0} open connections", _server.Statistics.ActiveConnections); if (taskStates.Count != 0) { statusMessage.AppendFormat(", {0} active background transfers", taskStates.Count); } return(new FtpResponse(211, statusMessage.ToString())); } var mask = command.Argument; if (!mask.EndsWith("*")) { mask += "*"; } var fsFeature = Connection.Features.Get <IFileSystemFeature>(); var globOptions = new GlobOptions(); globOptions.Evaluation.CaseInsensitive = fsFeature.FileSystem.FileSystemEntryComparer.Equals("a", "A"); var glob = Glob.Parse(mask, globOptions); var formatter = new LongListFormatter(); var entries = await fsFeature.FileSystem.GetEntriesAsync(fsFeature.CurrentDirectory, cancellationToken) .ConfigureAwait(false); var lines = entries.Where(x => glob.IsMatch(x.Name)) .Select(x => formatter.Format(x, x.Name)) .ToList(); return(new FtpResponseList( 211, $"STAT {command.Argument}", "STAT", lines)); }
/// <inheritdoc/> public override async Task <FtpResponse> Process(FtpCommand command, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(command.Argument)) { var taskStates = _backgroundTransferWorker.GetStates(); var statusMessage = new StringBuilder(); statusMessage.AppendFormat("Server functional, {0} open connections", _server.Statistics.ActiveConnections); if (taskStates.Count != 0) { statusMessage.AppendFormat(", {0} active background transfers", taskStates.Count); } return(new FtpResponse(211, statusMessage.ToString())); } var mask = command.Argument; if (!mask.EndsWith("*")) { mask += "*"; } var globOptions = new GlobOptions(); globOptions.Evaluation.CaseInsensitive = Data.FileSystem.FileSystemEntryComparer.Equals("a", "A"); var glob = Glob.Parse(mask, globOptions); var formatter = new LongListFormatter(); await Connection.WriteAsync($"211-STAT {command.Argument}", cancellationToken).ConfigureAwait(false); var entries = await Data.FileSystem.GetEntriesAsync(Data.CurrentDirectory, cancellationToken) .ConfigureAwait(false); foreach (var entry in entries.Where(x => glob.IsMatch(x.Name))) { var line = formatter.Format(entry, entry.Name); Connection.Log?.LogDebug(line); await Connection.WriteAsync($" {line}", cancellationToken).ConfigureAwait(false); } return(new FtpResponse(211, "STAT")); }
/// <inheritdoc/> public override async Task<FtpResponse> Process(FtpCommand command, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(command.Argument)) { var taskStates = Server.GetBackgroundTaskStates(); var statusMessage = new StringBuilder(); statusMessage.AppendFormat("Server functional, {0} open connections", Server.Statistics.ActiveConnections); if (taskStates.Count != 0) statusMessage.AppendFormat(", {0} active background transfers", taskStates.Count); return new FtpResponse(211, statusMessage.ToString()); } var mask = command.Argument; if (!mask.EndsWith("*")) mask += "*"; var mmOptions = new Options() { IgnoreCase = Data.FileSystem.FileSystemEntryComparer.Equals("a", "A"), NoGlobStar = true, Dot = true, }; var mm = new Minimatcher(mask, mmOptions); var formatter = new LongListFormatter(); await Connection.WriteAsync($"211-STAT {command.Argument}", cancellationToken); foreach (var entry in (await Data.FileSystem.GetEntriesAsync(Data.CurrentDirectory, cancellationToken)).Where(x => mm.IsMatch(x.Name))) { var line = formatter.Format(entry, entry.Name); Connection.Log?.Debug(line); await Connection.WriteAsync($" {line}", cancellationToken); } return new FtpResponse(211, "STAT"); }