public string MapPath (string virtualPath, string baseVirtualDir, bool allowCrossAppMapping)
{
if (worker_request == null)
throw HttpException.NewWithCode ("No HttpWorkerRequest", WebEventCodes.RuntimeErrorRequestAbort);
if (virtualPath == null)
virtualPath = "~";
else {
virtualPath = virtualPath.Trim ();
if (virtualPath.Length == 0)
virtualPath = "~";
}
if (!VirtualPathUtility.IsValidVirtualPath (virtualPath))
throw HttpException.NewWithCode (String.Format ("'{0}' is not a valid virtual path.", virtualPath), WebEventCodes.RuntimeErrorRequestAbort);
string appVirtualPath = HttpRuntime.AppDomainAppVirtualPath;
if (!VirtualPathUtility.IsRooted (virtualPath)) {
if (StrUtils.IsNullOrEmpty (baseVirtualDir))
baseVirtualDir = appVirtualPath;
virtualPath = VirtualPathUtility.Combine (VirtualPathUtility.AppendTrailingSlash (baseVirtualDir), virtualPath);
if (!VirtualPathUtility.IsAbsolute (virtualPath))
virtualPath = VirtualPathUtility.ToAbsolute (virtualPath, false);
} else if (!VirtualPathUtility.IsAbsolute (virtualPath))
virtualPath = VirtualPathUtility.ToAbsolute (virtualPath, false);
bool isAppVirtualPath = String.Compare (virtualPath, appVirtualPath, RuntimeHelpers.StringComparison) == 0;
appVirtualPath = VirtualPathUtility.AppendTrailingSlash (appVirtualPath);
if (!allowCrossAppMapping){
if (!StrUtils.StartsWith (virtualPath, appVirtualPath, true))
throw new ArgumentException ("MapPath: Mapping across applications not allowed");
if (appVirtualPath.Length > 1 && virtualPath.Length > 1 && virtualPath [0] != '/')
throw HttpException.NewWithCode ("MapPath: Mapping across applications not allowed", WebEventCodes.RuntimeErrorRequestAbort);
}
if (!isAppVirtualPath && !virtualPath.StartsWith (appVirtualPath, RuntimeHelpers.StringComparison))
throw new InvalidOperationException (String.Format ("Failed to map path '{0}'", virtualPath));
#if TARGET_JVM
return worker_request.MapPath (virtualPath);
#else
string path = worker_request.MapPath (virtualPath);
if (virtualPath [virtualPath.Length - 1] != '/' && path [path.Length - 1] == System.IO.Path.DirectorySeparatorChar)
path = path.TrimEnd (System.IO.Path.DirectorySeparatorChar);
return path;
#endif
}