public string GetCanonicalPath(string path)
{
var fullPath = GetFullRemotePath(path);
var canonizedPath = string.Empty;
var realPathFiles = RequestRealPath(fullPath, true);
if (realPathFiles != null)
{
canonizedPath = realPathFiles.First().Key;
}
if (!string.IsNullOrEmpty(canonizedPath))
return canonizedPath;
// Check for special cases
if (fullPath.EndsWith("/.", StringComparison.OrdinalIgnoreCase) ||
fullPath.EndsWith("/..", StringComparison.OrdinalIgnoreCase) ||
fullPath.Equals("/", StringComparison.OrdinalIgnoreCase) ||
fullPath.IndexOf('/') < 0)
return fullPath;
var pathParts = fullPath.Split('/');
var partialFullPath = string.Join("/", pathParts, 0, pathParts.Length - 1);
if (string.IsNullOrEmpty(partialFullPath))
partialFullPath = "/";
realPathFiles = RequestRealPath(partialFullPath, true);
if (realPathFiles != null)
{
canonizedPath = realPathFiles.First().Key;
}
if (string.IsNullOrEmpty(canonizedPath))
{
return fullPath;
}
var slash = string.Empty;
if (canonizedPath[canonizedPath.Length - 1] != '/')
slash = "/";
return string.Format(CultureInfo.InvariantCulture, "{0}{1}{2}", canonizedPath, slash, pathParts[pathParts.Length - 1]);
}