using Sunfish.Shares;
namespace Sunfish.Ftp;
/// <summary>Rutas de FTP: relativas a la carpeta actual o absolutas, con "." y "..".</summary>
internal static class FtpPath
{
/// <summary>
/// Combina la carpeta actual con el argumento de un comando. Acepta '/' y '\' como
/// separador (algunos clientes de DOS y Windows usan '\'). ".." por encima de la raiz se
/// queda en la raiz. Devuelve null si algun componente no es valido.
/// </summary>
public static List<string>? Resolve(IReadOnlyList<string> cwd, string? argument)
{
var result = new List<string>();
string arg = argument ?? "";
if (!(arg.StartsWith('/') || arg.StartsWith('\\')))
result.AddRange(cwd);
foreach (var part in arg.Split('/', '\\'))
{
if (part.Length == 0 || part == ".")
continue;
if (part == "..")
{
if (result.Count > 0)
result.RemoveAt(result.Count - 1);
continue;
}
if (!PathRules.IsValidSegment(part))
return null;
result.Add(part);
}
return result;
}
public static string Format(IReadOnlyList<string> segments) => "/" + string.Join('/', segments);
/// <summary>Comillas dobladas, como pide RFC 959 para la respuesta 257.</summary>
public static string Quote(string path) => "\"" + path.Replace("\"", "\"\"") + "\"";
}