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); }
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); }