blob: e3c925612d804b07e487ec7f151cf94474b72f87 [file] [log] [blame]
// //------------------------------------------------------------------------------
// // <copyright file="_UriSyntax.cs" company="Microsoft">
// // Copyright (c) Microsoft Corporation. All rights reserved.
// // </copyright>
// //------------------------------------------------------------------------------
//
// //
// // This file utilizes partial class feature and contains
// // only internal implementation of UriParser type
// //
//
// namespace System {
//
// using System.Collections.Generic;
// using System.Diagnostics;
// using System.Runtime.Versioning;
//
// // This enum specifies the Uri syntax flags that is understood by builtin Uri parser.
// [Flags]
// internal enum UriSyntaxFlags {
// None = 0x0,
//
// MustHaveAuthority = 0x1, // must have "//" after scheme:
// OptionalAuthority = 0x2, // used by generic parser due to unknown Uri syntax
// MayHaveUserInfo = 0x4,
// MayHavePort = 0x8,
// MayHavePath = 0x10,
// MayHaveQuery = 0x20,
// MayHaveFragment = 0x40,
//
// AllowEmptyHost = 0x80,
// AllowUncHost = 0x100,
// AllowDnsHost = 0x200,
// AllowIPv4Host = 0x400,
// AllowIPv6Host = 0x800,
// AllowAnInternetHost = AllowDnsHost|AllowIPv4Host|AllowIPv6Host,
// AllowAnyOtherHost = 0x1000, // Relaxed authority syntax
//
// FileLikeUri = 0x2000, //Special case to allow file:\\balbla or file://\\balbla
// MailToLikeUri = 0x4000, //V1 parser inheritance mailTo:AuthorityButNoSlashes
//
// V1_UnknownUri = 0x10000, // a Compatibility with V1 parser for an unknown scheme
// SimpleUserSyntax = 0x20000, // It is safe to not call virtual UriParser methods
// BuiltInSyntax = 0x40000, // This is a simple Uri plus it is hardcoded in the product
// ParserSchemeOnly = 0x80000, // This is a Parser that does only Uri scheme parsing
//
// AllowDOSPath = 0x100000, // will check for "x:\"
// PathIsRooted = 0x200000, // For an authority based Uri the first path char is '/'
// ConvertPathSlashes = 0x400000, // will turn '\' into '/'
// CompressPath = 0x800000, // For an authority based Uri remove/compress /./ /../ in the path
// CanonicalizeAsFilePath = 0x1000000, // remove/convert sequences /.../ /x../ /x./ dangerous for a DOS path
// UnEscapeDotsAndSlashes = 0x2000000, // additionally unescape dots and slashes before doing path compression
// AllowIdn = 0x4000000, // IDN host conversion allowed
// AllowIriParsing = 0x10000000, // Iri parsing. String is normalized, bidi control
// // characters are removed, unicode char limits are checked etc.
//
// // KeepTailLWS = 0x8000000,
// }
//
// //
// // Only internal members are included here
// //
// public abstract partial class UriParser {
// private static readonly Dictionary<String, UriParser> m_Table;
// private static Dictionary<String, UriParser> m_TempTable;
//
// private UriSyntaxFlags m_Flags;
//
// // Some flags (specified in c_UpdatableFlags) besides being set in the ctor, can also be set at a later
// // point. Such "updatable" flags can be set using SetUpdatableFlags(); if this method is called,
// // the value specified in the ctor is ignored (i.e. for all c_UpdatableFlags the value in m_Flags is
// // ignored), and the new value is used (i.e. for all c_UpdatableFlags the value in m_UpdatableFlags is used).
// private volatile UriSyntaxFlags m_UpdatableFlags;
// private volatile bool m_UpdatableFlagsUsed;
//
// // The following flags can be updated at any time.
// private const UriSyntaxFlags c_UpdatableFlags = UriSyntaxFlags.UnEscapeDotsAndSlashes;
//
// private int m_Port;
// private string m_Scheme;
//
// internal const int NoDefaultPort = -1;
// private const int c_InitialTableSize = 25;
//
// // These are always available without paying hashtable lookup cost
// // Note: see UpdateStaticSyntaxReference()
// internal static UriParser HttpUri;
// internal static UriParser HttpsUri;
// internal static UriParser WsUri;
// internal static UriParser WssUri;
// internal static UriParser FtpUri;
// internal static UriParser FileUri;
// internal static UriParser GopherUri;
// internal static UriParser NntpUri;
// internal static UriParser NewsUri;
// internal static UriParser MailToUri;
// internal static UriParser UuidUri;
// internal static UriParser TelnetUri;
// internal static UriParser LdapUri;
// internal static UriParser NetTcpUri;
// internal static UriParser NetPipeUri;
//
// internal static UriParser VsMacrosUri; //bad guy
//
//
// private enum UriQuirksVersion {
// // V1 = 1, // RFC 1738 - Not supported
// V2 = 2, // RFC 2396
// V3 = 3, // RFC 3986, 3987
// }
//
// // Store in a static field to allow for test manipulation and emergency workarounds via reflection.
// // Note this is not placed in the Uri class in order to avoid circular static dependencies.
// private static readonly UriQuirksVersion s_QuirksVersion =
// (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5
// // || BinaryCompatibility.TargetsAtLeast_Silverlight_V6
// // || BinaryCompatibility.TargetsAtLeast_Phone_V8_0
// ) ? UriQuirksVersion.V3 : UriQuirksVersion.V2;
//
// internal static bool ShouldUseLegacyV2Quirks {
// get {
// return s_QuirksVersion <= UriQuirksVersion.V2;
// }
// }
//
// internal static bool DontEnableStrictRFC3986ReservedCharacterSets
// {
// get {
// return LocalAppContextSwitches.DontEnableStrictRFC3986ReservedCharacterSets;
// }
// }
//
// internal static bool DontKeepUnicodeBidiFormattingCharacters
// {
// get
// {
// return LocalAppContextSwitches.DontKeepUnicodeBidiFormattingCharacters;
// }
// }
//
// static UriParser() {
//
// m_Table = new Dictionary<String, UriParser>(c_InitialTableSize);
// m_TempTable = new Dictionary<String, UriParser>(c_InitialTableSize);
//
// //Now we will call for the instance constructors that will interrupt this static one.
//
// // Below we simulate calls into FetchSyntax() but avoid using lock() and other things redundant for a .cctor
//
// HttpUri = new BuiltInUriParser("http", 80, HttpSyntaxFlags);
// m_Table[HttpUri.SchemeName] = HttpUri; //HTTP
//
// HttpsUri = new BuiltInUriParser("https", 443, HttpUri.m_Flags);
// m_Table[HttpsUri.SchemeName] = HttpsUri; //HTTPS cloned from HTTP
//
// WsUri = new BuiltInUriParser("ws", 80, HttpSyntaxFlags);
// m_Table[WsUri.SchemeName] = WsUri; // WebSockets
//
// WssUri = new BuiltInUriParser("wss", 443, HttpSyntaxFlags);
// m_Table[WssUri.SchemeName] = WssUri; // Secure WebSockets
//
// FtpUri = new BuiltInUriParser("ftp", 21, FtpSyntaxFlags);
// m_Table[FtpUri.SchemeName] = FtpUri; //FTP
//
// FileUri = new BuiltInUriParser("file", NoDefaultPort, FileSyntaxFlags);
// m_Table[FileUri.SchemeName] = FileUri; //FILE
//
// GopherUri = new BuiltInUriParser("gopher", 70, GopherSyntaxFlags);
// m_Table[GopherUri.SchemeName] = GopherUri; //GOPHER
//
// NntpUri = new BuiltInUriParser("nntp", 119, NntpSyntaxFlags);
// m_Table[NntpUri.SchemeName] = NntpUri; //NNTP
//
// NewsUri = new BuiltInUriParser("news", NoDefaultPort, NewsSyntaxFlags);
// m_Table[NewsUri.SchemeName] = NewsUri; //NEWS
//
// MailToUri = new BuiltInUriParser("mailto", 25, MailtoSyntaxFlags);
// m_Table[MailToUri.SchemeName] = MailToUri; //MAILTO
//
// UuidUri = new BuiltInUriParser("uuid", NoDefaultPort, NewsUri.m_Flags);
// m_Table[UuidUri.SchemeName] = UuidUri; //UUID cloned from NEWS
//
// TelnetUri = new BuiltInUriParser("telnet", 23, TelnetSyntaxFlags);
// m_Table[TelnetUri.SchemeName] = TelnetUri; //TELNET
//
// LdapUri = new BuiltInUriParser("ldap", 389, LdapSyntaxFlags);
// m_Table[LdapUri.SchemeName] = LdapUri; //LDAP
//
// NetTcpUri = new BuiltInUriParser("net.tcp", 808, NetTcpSyntaxFlags);
// m_Table[NetTcpUri.SchemeName] = NetTcpUri;
//
// NetPipeUri = new BuiltInUriParser("net.pipe", NoDefaultPort, NetPipeSyntaxFlags);
// m_Table[NetPipeUri.SchemeName] = NetPipeUri;
//
// VsMacrosUri = new BuiltInUriParser("vsmacros", NoDefaultPort, VsmacrosSyntaxFlags);
// m_Table[VsMacrosUri.SchemeName] = VsMacrosUri; //VSMACROS
//
// }
// //
// private class BuiltInUriParser: UriParser
// {
// //
// // All BuiltIn parsers use that ctor. They are marked with "simple" and "built-in" flags
// //
// internal BuiltInUriParser(string lwrCaseScheme, int defaultPort, UriSyntaxFlags syntaxFlags)
// : base ((syntaxFlags | UriSyntaxFlags.SimpleUserSyntax | UriSyntaxFlags.BuiltInSyntax))
// {
// m_Scheme = lwrCaseScheme;
// m_Port = defaultPort;
// }
// }
// //
// internal UriSyntaxFlags Flags {
// get {
// return m_Flags;
// }
// }
// //
// internal bool NotAny(UriSyntaxFlags flags)
// {
// // Return true if none of the flags specified in 'flags' are set.
// return IsFullMatch(flags, UriSyntaxFlags.None);
// }
// //
// internal bool InFact(UriSyntaxFlags flags)
// {
// // Return true if at least one of the flags in 'flags' is set.
// return !IsFullMatch(flags, UriSyntaxFlags.None);
// }
// //
// internal bool IsAllSet(UriSyntaxFlags flags)
// {
// // Return true if all flags in 'flags' are set.
// return IsFullMatch(flags, flags);
// }
//
// private bool IsFullMatch(UriSyntaxFlags flags, UriSyntaxFlags expected)
// {
// // Return true, if masking the current set of flags with 'flags' equals 'expected'.
// // Definition 'current set of flags':
// // a) if updatable flags were never set: m_Flags
// // b) if updatable flags were set: set union between all flags in m_Flags which are not updatable
// // (i.e. not part of c_UpdatableFlags) and all flags in m_UpdatableFlags
//
// UriSyntaxFlags mergedFlags;
//
// // if none of the flags in 'flags' is an updatable flag, we ignore m_UpdatableFlags
// if (((flags & c_UpdatableFlags) == 0) || !m_UpdatableFlagsUsed)
// {
// mergedFlags = m_Flags;
// }
// else
// {
// // mask m_Flags to only use the flags not in c_UpdatableFlags
// mergedFlags = (m_Flags & (~c_UpdatableFlags)) | m_UpdatableFlags;
// }
//
// return (mergedFlags & flags) == expected;
// }
//
// //
// // Internal .ctor, any ctor eventually goes through this one
// //
// internal UriParser(UriSyntaxFlags flags)
// {
// m_Flags = flags;
// m_Scheme = string.Empty;
// }
// //
// private static void FetchSyntax(UriParser syntax, string lwrCaseSchemeName, int defaultPort)
// {
// if (syntax.SchemeName.Length != 0)
// throw new InvalidOperationException(SR.GetString(SR.net_uri_NeedFreshParser, syntax.SchemeName));
//
// lock (m_Table)
// {
// syntax.m_Flags &= ~UriSyntaxFlags.V1_UnknownUri;
// UriParser oldSyntax = null;
// m_Table.TryGetValue(lwrCaseSchemeName, out oldSyntax);
// if (oldSyntax != null)
// throw new InvalidOperationException(SR.GetString(SR.net_uri_AlreadyRegistered, oldSyntax.SchemeName));
//
// m_TempTable.TryGetValue(syntax.SchemeName, out oldSyntax);
// if (oldSyntax != null)
// {
// // optimization on schemeName, will try to keep the first reference
// lwrCaseSchemeName = oldSyntax.m_Scheme;
// m_TempTable.Remove(lwrCaseSchemeName);
// }
//
// syntax.OnRegister(lwrCaseSchemeName, defaultPort);
// syntax.m_Scheme = lwrCaseSchemeName;
// syntax.CheckSetIsSimpleFlag();
// syntax.m_Port = defaultPort;
//
// m_Table[syntax.SchemeName] = syntax;
// }
// }
// //
// private const int c_MaxCapacity = 512;
// //schemeStr must be in lower case!
// internal static UriParser FindOrFetchAsUnknownV1Syntax(string lwrCaseScheme) {
//
// // check may be other thread just added one
// UriParser syntax = null;
// m_Table.TryGetValue(lwrCaseScheme, out syntax);
// if (syntax != null) {
// return syntax;
// }
// m_TempTable.TryGetValue(lwrCaseScheme, out syntax);
// if (syntax != null) {
// return syntax;
// }
// lock (m_Table) {
// // This is a bit paranoid but let's prevent static table growing infinitly
// if (m_TempTable.Count >= c_MaxCapacity) {
// m_TempTable = new Dictionary<String, UriParser>(c_InitialTableSize);
// }
// syntax = new BuiltInUriParser(lwrCaseScheme, NoDefaultPort, UnknownV1SyntaxFlags);
// m_TempTable[lwrCaseScheme] = syntax;
// return syntax;
// }
// }
// //
// internal static UriParser GetSyntax(string lwrCaseScheme) {
// UriParser ret = null;
// m_Table.TryGetValue(lwrCaseScheme, out ret);
// if (ret == null) {
// m_TempTable.TryGetValue(lwrCaseScheme, out ret);
// }
// return ret;
// }
// //
// // Builtin and User Simple syntaxes do not need custom validation/parsing (i.e. virtual method calls),
// //
// internal bool IsSimple
// {
// get {
// return InFact(UriSyntaxFlags.SimpleUserSyntax);
// }
// }
// //
// internal void CheckSetIsSimpleFlag()
// {
// Type type = this.GetType();
//
// if ( type == typeof(GenericUriParser)
// || type == typeof(HttpStyleUriParser)
// || type == typeof(FtpStyleUriParser)
// || type == typeof(FileStyleUriParser)
// || type == typeof(NewsStyleUriParser)
// || type == typeof(GopherStyleUriParser)
// || type == typeof(NetPipeStyleUriParser)
// || type == typeof(NetTcpStyleUriParser)
// || type == typeof(LdapStyleUriParser)
// )
// {
// m_Flags |= UriSyntaxFlags.SimpleUserSyntax;
// }
// }
//
// //
// // This method is used to update flags. The scenario where this is needed is when the user specifies
// // flags in the config file. The config file is read after UriParser instances were created.
// //
// internal void SetUpdatableFlags(UriSyntaxFlags flags) {
//
// Debug.Assert(!m_UpdatableFlagsUsed,
// "SetUpdatableFlags() already called. It can only be called once per parser.");
// Debug.Assert((flags & (~c_UpdatableFlags)) == 0, "Only updatable flags can be set.");
//
// // No locks necessary. Reordering won't happen due to volatile.
// m_UpdatableFlags = flags;
// m_UpdatableFlagsUsed = true;
// }
//
// //
// // These are simple internal wrappers that will call virtual protected methods
// // (to avoid "protected internal" siganures in the public docs)
// //
// internal UriParser InternalOnNewUri()
// {
// UriParser effectiveParser = OnNewUri();
// if ((object)this != (object)effectiveParser)
// {
// effectiveParser.m_Scheme = m_Scheme;
// effectiveParser.m_Port = m_Port;
// effectiveParser.m_Flags = m_Flags;
// }
// return effectiveParser;
// }
//
// //
// internal void InternalValidate(Uri thisUri, out UriFormatException parsingError)
// {
// InitializeAndValidate(thisUri, out parsingError);
// }
//
// //
// internal string InternalResolve(Uri thisBaseUri, Uri uriLink, out UriFormatException parsingError)
// {
// return Resolve(thisBaseUri, uriLink, out parsingError);
// }
//
// //
// internal bool InternalIsBaseOf(Uri thisBaseUri, Uri uriLink)
// {
// return IsBaseOf(thisBaseUri, uriLink);
// }
//
// //
// internal string InternalGetComponents(Uri thisUri, UriComponents uriComponents, UriFormat uriFormat)
// {
// return GetComponents(thisUri, uriComponents, uriFormat);
// }
//
// //
// internal bool InternalIsWellFormedOriginalString(Uri thisUri)
// {
// return IsWellFormedOriginalString(thisUri);
// }
//
// //
// // Various Uri scheme syntax flags
// //
// private const UriSyntaxFlags UnknownV1SyntaxFlags =
// UriSyntaxFlags.V1_UnknownUri | // This flag must be always set here
// UriSyntaxFlags.OptionalAuthority |
// //
// UriSyntaxFlags.MayHaveUserInfo |
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveQuery |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.AllowEmptyHost |
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// // UriSyntaxFlags.AllowAnyOtherHost | // V1.1 has a bug and so does not support this case
// //
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.AllowDOSPath | //
// UriSyntaxFlags.ConvertPathSlashes | // V1 compat, it will always convert backslashes
// UriSyntaxFlags.CompressPath | // V1 compat, it will always compress path even for non hierarchical Uris
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
// private static readonly UriSyntaxFlags HttpSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.MayHaveUserInfo |
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveQuery |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.PathIsRooted |
// //
// UriSyntaxFlags.ConvertPathSlashes |
// UriSyntaxFlags.CompressPath |
// UriSyntaxFlags.CanonicalizeAsFilePath |
// (UriParser.ShouldUseLegacyV2Quirks
// ? UriSyntaxFlags.UnEscapeDotsAndSlashes : UriSyntaxFlags.None) |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
// private const UriSyntaxFlags FtpSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.MayHaveUserInfo |
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.PathIsRooted |
// //
// UriSyntaxFlags.ConvertPathSlashes |
// UriSyntaxFlags.CompressPath |
// UriSyntaxFlags.CanonicalizeAsFilePath|
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
// private static readonly UriSyntaxFlags FileSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.AllowEmptyHost |
// UriSyntaxFlags.AllowUncHost |
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// (UriParser.ShouldUseLegacyV2Quirks
// ? UriSyntaxFlags.None : UriSyntaxFlags.MayHaveQuery) |
// //
// UriSyntaxFlags.FileLikeUri |
// //
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.AllowDOSPath |
// //
// UriSyntaxFlags.ConvertPathSlashes |
// UriSyntaxFlags.CompressPath |
// UriSyntaxFlags.CanonicalizeAsFilePath |
// UriSyntaxFlags.UnEscapeDotsAndSlashes |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
//
// // bad guy
// private const UriSyntaxFlags VsmacrosSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.AllowEmptyHost |
// UriSyntaxFlags.AllowUncHost |
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.FileLikeUri |
// //
// UriSyntaxFlags.AllowDOSPath |
// UriSyntaxFlags.ConvertPathSlashes |
// UriSyntaxFlags.CompressPath |
// UriSyntaxFlags.CanonicalizeAsFilePath |
// UriSyntaxFlags.UnEscapeDotsAndSlashes |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
// private const UriSyntaxFlags GopherSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.MayHaveUserInfo |
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
// // UriSyntaxFlags.KeepTailLWS |
//
// //Note that NNTP and NEWS are quite different in syntax
// private const UriSyntaxFlags NewsSyntaxFlags =
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// UriSyntaxFlags.AllowIriParsing;
//
// private const UriSyntaxFlags NntpSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.MayHaveUserInfo|
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
//
// private const UriSyntaxFlags TelnetSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.MayHaveUserInfo|
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
//
// private const UriSyntaxFlags LdapSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// //
// UriSyntaxFlags.AllowEmptyHost |
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.MayHaveUserInfo |
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveQuery |
// UriSyntaxFlags.MayHaveFragment |
// //
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
//
// private const UriSyntaxFlags MailtoSyntaxFlags =
// //
// UriSyntaxFlags.AllowEmptyHost |
// UriSyntaxFlags.AllowUncHost | //
// UriSyntaxFlags.AllowAnInternetHost |
// //
// UriSyntaxFlags.MayHaveUserInfo |
// UriSyntaxFlags.MayHavePort |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveFragment |
// UriSyntaxFlags.MayHaveQuery | //to maintain everett compat
// //
// UriSyntaxFlags.MailToLikeUri |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
//
//
// private const UriSyntaxFlags NetPipeSyntaxFlags =
// UriSyntaxFlags.MustHaveAuthority |
// UriSyntaxFlags.MayHavePath |
// UriSyntaxFlags.MayHaveQuery |
// UriSyntaxFlags.MayHaveFragment |
// UriSyntaxFlags.AllowAnInternetHost |
// UriSyntaxFlags.PathIsRooted |
// UriSyntaxFlags.ConvertPathSlashes |
// UriSyntaxFlags.CompressPath |
// UriSyntaxFlags.CanonicalizeAsFilePath |
// UriSyntaxFlags.UnEscapeDotsAndSlashes |
// UriSyntaxFlags.AllowIdn |
// UriSyntaxFlags.AllowIriParsing;
//
//
// private const UriSyntaxFlags NetTcpSyntaxFlags = NetPipeSyntaxFlags | UriSyntaxFlags.MayHavePort;
//
// }
// }