Add REST command
This commit is contained in:
@@ -25,6 +25,7 @@ namespace DearFTP.Connection.Commands
|
|||||||
new QuitCommand(),
|
new QuitCommand(),
|
||||||
new RenameCommand(),
|
new RenameCommand(),
|
||||||
new RetrieveCommand(),
|
new RetrieveCommand(),
|
||||||
|
new RestartCommand(),
|
||||||
new SiteCommand(),
|
new SiteCommand(),
|
||||||
new SizeCommand(),
|
new SizeCommand(),
|
||||||
new StoreCommand(),
|
new StoreCommand(),
|
||||||
|
|||||||
27
DearFTP/Connection/Commands/RestartCommand.cs
Normal file
27
DearFTP/Connection/Commands/RestartCommand.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace DearFTP.Connection.Commands
|
||||||
|
{
|
||||||
|
class RestartCommand : ICommand
|
||||||
|
{
|
||||||
|
public string[] Aliases { get; } = new string[]
|
||||||
|
{
|
||||||
|
"REST"
|
||||||
|
};
|
||||||
|
|
||||||
|
public void Execute(Session session, FtpStream stream, string alias, string argument)
|
||||||
|
{
|
||||||
|
if (uint.TryParse(argument, out uint position))
|
||||||
|
{
|
||||||
|
session.RestartPosition = (int)position;
|
||||||
|
stream.Send(ResponseCode.PendingFurtherInformation, $"Restart position set to {position}.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stream.Send(ResponseCode.ArgumentsError, "Specified position is not a valid number.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -40,28 +40,44 @@ namespace DearFTP.Connection.Commands
|
|||||||
|
|
||||||
stream.Send(ResponseCode.FileStatusOK, "File coming.");
|
stream.Send(ResponseCode.FileStatusOK, "File coming.");
|
||||||
|
|
||||||
SendFile(dataConnection.Stream, realPath);
|
int restartPosition = session.RestartPosition;
|
||||||
|
session.RestartPosition = 0;
|
||||||
|
|
||||||
|
SendFile(dataConnection.Stream, realPath, restartPosition);
|
||||||
|
|
||||||
dataConnection.Close();
|
dataConnection.Close();
|
||||||
|
|
||||||
stream.Send(ResponseCode.CloseDataConnection, "File sent.");
|
stream.Send(ResponseCode.CloseDataConnection, "File sent.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFile(Stream stream, string path)
|
private void SendFile(Stream stream, string path, int offset)
|
||||||
{
|
{
|
||||||
using (var file = File.OpenRead(path))
|
using (var file = File.OpenRead(path))
|
||||||
{
|
{
|
||||||
|
if (offset != 0)
|
||||||
|
{
|
||||||
|
file.Seek(offset, SeekOrigin.Begin);
|
||||||
|
}
|
||||||
|
|
||||||
Span<byte> buffer = stackalloc byte[BufferSize];
|
Span<byte> buffer = stackalloc byte[BufferSize];
|
||||||
long bytesToWrite = Math.Min(file.Length - file.Position, BufferSize);
|
long bytesToWrite = Math.Min(file.Length - file.Position, BufferSize);
|
||||||
|
|
||||||
while (file.Read(buffer) > 0)
|
while (file.Read(buffer) > 0)
|
||||||
{
|
{
|
||||||
if (bytesToWrite < BufferSize)
|
try
|
||||||
{
|
{
|
||||||
stream.Write(buffer.Slice(0, (int)bytesToWrite));
|
if (bytesToWrite < BufferSize)
|
||||||
break;
|
{
|
||||||
|
stream.Write(buffer.Slice(0, (int)bytesToWrite));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.Write(buffer);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
stream.Write(buffer);
|
|
||||||
|
|
||||||
bytesToWrite = Math.Min(file.Length - file.Position, BufferSize);
|
bytesToWrite = Math.Min(file.Length - file.Position, BufferSize);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,11 +19,12 @@ namespace DearFTP.Connection
|
|||||||
public User User { get; set; }
|
public User User { get; set; }
|
||||||
public Share[] Shares { get; set; }
|
public Share[] Shares { get; set; }
|
||||||
public Share[] WritablesShares { get; set; }
|
public Share[] WritablesShares { get; set; }
|
||||||
public FtpStream FtpStream { get; }
|
|
||||||
public NavigablePath NavigablePath { get; set; }
|
public NavigablePath NavigablePath { get; set; }
|
||||||
|
public FtpStream FtpStream { get; }
|
||||||
|
public DataConnection DataConnection { get; set; }
|
||||||
|
public int RestartPosition { get; set; }
|
||||||
public string CurrentWorkingDirectory => NavigablePath.CurrentDirectory;
|
public string CurrentWorkingDirectory => NavigablePath.CurrentDirectory;
|
||||||
public string IP => ((IPEndPoint)_client.Client.LocalEndPoint).Address.ToString();
|
public string IP => ((IPEndPoint)_client.Client.LocalEndPoint).Address.ToString();
|
||||||
public DataConnection DataConnection { get; set; }
|
|
||||||
|
|
||||||
private TcpClient _client;
|
private TcpClient _client;
|
||||||
private NetworkStream _networkStream;
|
private NetworkStream _networkStream;
|
||||||
@@ -39,6 +40,7 @@ namespace DearFTP.Connection
|
|||||||
CommandsDispatcher = FtpServer.Instance.CommandsDispatcher;
|
CommandsDispatcher = FtpServer.Instance.CommandsDispatcher;
|
||||||
Logger = FtpServer.Instance.Logger;
|
Logger = FtpServer.Instance.Logger;
|
||||||
DataConnection = new DataConnection();
|
DataConnection = new DataConnection();
|
||||||
|
RestartPosition = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start()
|
public void Start()
|
||||||
|
|||||||
Reference in New Issue
Block a user