Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / MIT / System / Web / Mobile / UrlPath.cs / 1305376 / UrlPath.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* * UrlPath class. * * Copyright (c) 1999 Microsoft Corporation */ using System.Text; using System.Runtime.Serialization.Formatters; using System.Runtime.InteropServices; using System.Collections; using System.Diagnostics; namespace System.Web.Mobile { /* * URL Path library. */ [Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")] internal static class UrlPath { private const char appRelativeCharacter = '~'; internal static bool IsRooted(String basepath) { return(basepath == null || basepath.Length == 0 || basepath[0] == '/' || basepath[0] == '\\'); } internal static bool IsRelativeUrl(string url) { // If it has a protocol, it's not relative if (url.IndexOf(":", StringComparison.Ordinal) != -1) { return false; } return !IsRooted(url); } internal static String GetDirectory(String path) { if (path == null || path.Length == 0) { throw new ArgumentException(SR.GetString(SR.UrlPath_EmptyPathHasNoDirectory)); } if (path[0] != '/' && path[0] != appRelativeCharacter) { throw new ArgumentException(SR.GetString(SR.UrlPath_PathMustBeRooted)); } // Make sure there is a filename after the last '/' Debug.Assert(path[path.Length-1] != '/', "Path should not end with a /"); string dir = path.Substring(0, path.LastIndexOf('/')); // If it's the root dir, we would end up with "". Return "/" instead if (dir.Length == 0) { return "/"; } return dir; } private static void FailIfPhysicalPath(string path) { if (path == null || path.Length < 4) { return; } if (path[1] == ':' || (path[0] == '\\' && path[1] == '\\')) { throw new Exception(SR.GetString(SR.UrlPath_PhysicalPathNotAllowed, path)); } } internal static String Combine(String basepath, String relative) { String path; // Make sure the relative path is not a physical path (bug 73641) FailIfPhysicalPath(relative); if (IsRooted(relative)) { path = relative; if (path == null || path.Length == 0) { return String.Empty; } } else { // If the relative path starts with "~/" or "~\", treat it as app root // relative (bug 68628) if (relative.Length >=3 && relative[0] == appRelativeCharacter && (relative[1] == '/' || relative[1] == '\\')) { String appPath = HttpRuntime.AppDomainAppVirtualPath; if (appPath.Length > 1) { path = appPath + "/" + relative.Substring(2); } else { path = "/" + relative.Substring(2); } } else { if (basepath == null || (basepath.Length == 1 && basepath[0] == '/')) { basepath = String.Empty; } path = basepath + "/" + relative; } } return Reduce(path); } internal static String Reduce(String path) { // ignore query string String queryString = null; if (path != null) { int iqs = path.IndexOf('?'); if (iqs >= 0) { queryString = path.Substring(iqs); path = path.Substring(0, iqs); } } int length = path.Length; int examine; // Make sure we don't have any back slashes path = path.Replace('\\', '/'); // quickly rule out situations in which there are no . or .. for (examine = 0; ; examine++) { examine = path.IndexOf('.', examine); if (examine < 0) { return (queryString != null) ? (path + queryString) : path; } if ((examine == 0 || path[examine - 1] == '/') && (examine + 1 == length || path[examine + 1] == '/' || (path[examine + 1] == '.' && (examine + 2 == length || path[examine + 2] == '/')))) { break; } } // OK, we found a . or .. so process it: ArrayList list = new ArrayList(); StringBuilder sb = new StringBuilder(); int start; examine = 0; for (;;) { start = examine; examine = path.IndexOf('/', start + 1); if (examine < 0) { examine = length; } if (examine - start <= 3 && (examine < 1 || path[examine - 1] == '.') && (start + 1 >= length || path[start + 1] == '.')) { if (examine - start == 3) { if (list.Count == 0) { throw new Exception(SR.GetString(SR.UrlPath_CannotExitUpTopDirectory)); } sb.Length = (int)list[list.Count - 1]; list.RemoveRange(list.Count - 1, 1); } } else { list.Add(sb.Length); sb.Append(path, start, examine - start); } if (examine == length) { break; } } return sb.ToString() + queryString; } private const string dummyProtocolAndServer = "http://foo"; // Return the relative vpath path from one rooted vpath to another internal static string MakeRelative(string from, string to) { // If either path is app relative (~/...), make it absolute, since the Uri // class wouldn't know how to deal with it. from = MakeVirtualPathAppAbsolute(from); to = MakeVirtualPathAppAbsolute(to); // Make sure both virtual paths are rooted Debug.Assert(IsRooted(from)); Debug.Assert(IsRooted(to)); // Uri's need full url's so, we use a dummy root Uri fromUri = new Uri(dummyProtocolAndServer + from); Uri toUri = new Uri(dummyProtocolAndServer + to); return fromUri.MakeRelative(toUri); } // If a virtual path is app relative (i.e. starts with ~/), change it to // start with the actuall app path. // E.g. ~/Sub/foo.aspx --> /MyApp/Sub/foo.aspx internal static string MakeVirtualPathAppAbsolute(string virtualPath) { // If the path is exactly "~", just return the app root path if (virtualPath.Length == 1 && virtualPath[0] == appRelativeCharacter) return HttpRuntime.AppDomainAppVirtualPath; // If the virtual path starts with "~/" or "~\", replace with the app path // relative (ASURT 68628) if (virtualPath.Length >=2 && virtualPath[0] == appRelativeCharacter && (virtualPath[1] == '/' || virtualPath[1] == '\\')) { string appPath = HttpRuntime.AppDomainAppVirtualPath; if (appPath.Length > 1) return appPath + "/" + virtualPath.Substring(2); else return "/" + virtualPath.Substring(2); } // Return it unchanged return virtualPath; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FixedSOMPageConstructor.cs
- TextContainerHelper.cs
- CollectionEditor.cs
- UIElement3D.cs
- _ListenerResponseStream.cs
- OutputCacheProfile.cs
- ObjectAnimationBase.cs
- SqlNode.cs
- SingleConverter.cs
- HotSpotCollection.cs
- Lease.cs
- SafeViewOfFileHandle.cs
- TimeSpanConverter.cs
- DrawingContextWalker.cs
- TCPListener.cs
- TreeViewItemAutomationPeer.cs
- ScrollEvent.cs
- StrokeCollectionConverter.cs
- ViewCellRelation.cs
- TemplateBindingExtension.cs
- Figure.cs
- SendParametersContent.cs
- DisplayInformation.cs
- Pts.cs
- CultureInfo.cs
- ConnectionPointCookie.cs
- Security.cs
- OuterGlowBitmapEffect.cs
- CollectionBuilder.cs
- ToolStripDropDownClosingEventArgs.cs
- DispatcherProcessingDisabled.cs
- SqlSelectClauseBuilder.cs
- WebPartEventArgs.cs
- ArrangedElement.cs
- ConcurrentBag.cs
- NameSpaceEvent.cs
- SHA512.cs
- TreeBuilder.cs
- XamlClipboardData.cs
- PolicyStatement.cs
- ContainerUtilities.cs
- Pointer.cs
- TreeNodeStyleCollection.cs
- FileDialogPermission.cs
- StringTraceRecord.cs
- Variable.cs
- DataViewSetting.cs
- Baml2006ReaderFrame.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- VSWCFServiceContractGenerator.cs
- DocumentCollection.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- MultiBindingExpression.cs
- WpfPayload.cs
- DataViewSetting.cs
- SiteMapHierarchicalDataSourceView.cs
- SignedXml.cs
- HostedHttpContext.cs
- LabelEditEvent.cs
- RijndaelManaged.cs
- WebHeaderCollection.cs
- SQLMembershipProvider.cs
- TheQuery.cs
- HierarchicalDataSourceControl.cs
- QueryContinueDragEvent.cs
- WebRequestModulesSection.cs
- SEHException.cs
- SafeReversePInvokeHandle.cs
- Int32.cs
- XmlConvert.cs
- AlternationConverter.cs
- DataGridViewLinkCell.cs
- PackUriHelper.cs
- HtmlMeta.cs
- PopupRootAutomationPeer.cs
- WebServiceParameterData.cs
- WebPartEditorOkVerb.cs
- MenuCommand.cs
- ProcessHostMapPath.cs
- EntityClassGenerator.cs
- PrePostDescendentsWalker.cs
- RectAnimationClockResource.cs
- Aes.cs
- ProvidersHelper.cs
- PropertyStore.cs
- DataViewManagerListItemTypeDescriptor.cs
- JpegBitmapEncoder.cs
- WeakReferenceEnumerator.cs
- AddressHeader.cs
- DataTableNameHandler.cs
- DeviceContexts.cs
- FileClassifier.cs
- XamlGridLengthSerializer.cs
- Clipboard.cs
- HttpModuleAction.cs
- LinqDataSourceDisposeEventArgs.cs
- RequestCachePolicy.cs
- BypassElement.cs
- ButtonStandardAdapter.cs
- InternalConfigConfigurationFactory.cs