private static bool VirtualPathStartsWithVirtualPath(string virtualPath1, string virtualPath2) { if (virtualPath1 == null) { throw new ArgumentNullException("virtualPath1"); } if (virtualPath2 == null) { throw new ArgumentNullException("virtualPath2"); } if (!StringUtil.StringStartsWithIgnoreCase(virtualPath1, virtualPath2)) { return(false); } int length = virtualPath2.Length; if (virtualPath1.Length != length) { if (length == 1) { return(true); } if (virtualPath2[length - 1] == '/') { return(true); } if (virtualPath1[length] != '/') { return(false); } } return(true); }
internal static string MakeVirtualPathAppRelative(string virtualPath, string applicationPath, bool nullIfNotInApp) { if (virtualPath == null) { throw new ArgumentNullException("virtualPath"); } int length = applicationPath.Length; int num2 = virtualPath.Length; if ((num2 == (length - 1)) && StringUtil.StringStartsWithIgnoreCase(applicationPath, virtualPath)) { return("~/"); } if (!VirtualPathStartsWithVirtualPath(virtualPath, applicationPath)) { if (nullIfNotInApp) { return(null); } return(virtualPath); } if (num2 == length) { return("~/"); } if (length == 1) { return('~' + virtualPath); } return('~' + virtualPath.Substring(length - 1)); }
// If a virtual path starts with the app path, make it start with // ~ instead, so that it becomes application agnostic // E.g. /MyApp/Sub/foo.aspx --> ~/Sub/foo.aspx internal static string MakeVirtualPathAppRelative(string virtualPath, string applicationPath, bool nullIfNotInApp) { if (virtualPath == null) { throw new ArgumentNullException("virtualPath"); } Debug.Assert(applicationPath[0] == '/'); Debug.Assert(HasTrailingSlash(applicationPath)); int appPathLength = applicationPath.Length; int virtualPathLength = virtualPath.Length; // If virtualPath is the same as the app path, but without the ending slash, // treat it as if it were truly the app path (VSWhidbey 495949) if (virtualPathLength == appPathLength - 1) { if (StringUtil.StringStartsWithIgnoreCase(applicationPath, virtualPath)) { return(appRelativeCharacterString); } } if (!VirtualPathStartsWithVirtualPath(virtualPath, applicationPath)) { // If it doesn't start with the app path, return either null or the input path if (nullIfNotInApp) { return(null); } else { return(virtualPath); } } // If they are the same, just return "~/" if (virtualPathLength == appPathLength) { return(appRelativeCharacterString); } // Special case for apps rooted at the root: if (appPathLength == 1) { return(appRelativeCharacter + virtualPath); } return(appRelativeCharacter + virtualPath.Substring(appPathLength - 1)); }
private static bool VirtualPathStartsWithVirtualPath(string virtualPath1, string virtualPath2) { if (virtualPath1 == null) { throw new ArgumentNullException("virtualPath1"); } if (virtualPath2 == null) { throw new ArgumentNullException("virtualPath2"); } // if virtualPath1 as a string doesn't start with virtualPath2 as s string, then no for sure if (!StringUtil.StringStartsWithIgnoreCase(virtualPath1, virtualPath2)) { return(false); } int virtualPath2Length = virtualPath2.Length; // same length - same path if (virtualPath1.Length == virtualPath2Length) { return(true); } // Special case for apps rooted at the root. VSWhidbey 286145 if (virtualPath2Length == 1) { Debug.Assert(virtualPath2[0] == '/'); return(true); } // If virtualPath2 ends with a '/', it's definitely a child if (virtualPath2[virtualPath2Length - 1] == '/') { return(true); } // If it doesn't, make sure the next char in virtualPath1 is a '/'. // e.g. /app1 vs /app11 (VSWhidbey 285038) if (virtualPath1[virtualPath2Length] != '/') { return(false); } // passed all checks return(true); }