Example #1
0
        private static bool ParseWindowsFilePath(ParserState state)
        {
            var scheme = state.elements.scheme;

            if (!string.IsNullOrEmpty(scheme) &&
                scheme != Uri.UriSchemeFile && UriHelper.IsKnownScheme(scheme))
            {
                return(state.remaining.Length > 0);
            }

            string part = state.remaining;

            if (part.Length > 0 && (part [0] == '/' || part [0] == '\\'))
            {
                part = part.Substring(1);
            }

            if (part.Length < 2 || part [1] != ':')
            {
                return(state.remaining.Length > 0);
            }

            if (!IsAlpha(part [0]))
            {
                if (state.kind == UriKind.Absolute)
                {
                    state.error = "Invalid URI: The URI scheme is not valid.";
                    return(false);
                }
                state.elements.isAbsoluteUri = false;
                state.elements.path          = part;
                return(false);
            }

            if (part.Length > 2 && part [2] != '\\' && part [2] != '/')
            {
                state.error = "Relative file path is not allowed.";
                return(false);
            }

            if (string.IsNullOrEmpty(scheme))
            {
                state.elements.scheme    = Uri.UriSchemeFile;
                state.elements.delimiter = "://";
            }

            state.elements.path = part.Replace("\\", "/");

            return(false);
        }
Example #2
0
        private static bool ParseDelimiter(ParserState state)
        {
            var delimiter = Uri.GetSchemeDelimiter(state.elements.scheme);

            if (!state.remaining.StartsWith(delimiter, StringComparison.Ordinal))
            {
                if (UriHelper.IsKnownScheme(state.elements.scheme))
                {
                    state.error = "Invalid URI: The Authority/Host could not be parsed.";
                    return(false);
                }

                delimiter = ":";
            }

            state.elements.delimiter = delimiter;

            state.remaining = state.remaining.Substring(delimiter.Length);

            return(state.remaining.Length > 0);
        }