internal static string NormalizeLocationSubPath(string subPath, IConfigErrorInfo errorInfo) {
// if subPath is null or empty, it is the current dir
if (String.IsNullOrEmpty(subPath))
return null;
// if subPath=".", it is the current dir
if (subPath == ".")
return null;
// do not allow whitespace in front of subPath, as the OS
// handles beginning and trailing whitespace inconsistently
string trimmedSubPath = subPath.TrimStart();
if (trimmedSubPath.Length != subPath.Length) {
throw new ConfigurationErrorsException(SR.GetString(SR.Config_location_path_invalid_first_character), errorInfo);
}
// do not allow problematic starting characters
if (invalidFirstSubPathCharacters.IndexOf(subPath[0]) != -1) {
throw new ConfigurationErrorsException(SR.GetString(SR.Config_location_path_invalid_first_character), errorInfo);
}
// do not allow whitespace at end of subPath, as the OS
// handles beginning and trailing whitespace inconsistently
trimmedSubPath = subPath.TrimEnd();
if (trimmedSubPath.Length != subPath.Length) {
throw new ConfigurationErrorsException(SR.GetString(SR.Config_location_path_invalid_last_character), errorInfo);
}
// the file system ignores trailing '.', '\', or '/', so do not allow it in a location subpath specification
if (invalidLastSubPathCharacters.IndexOf(subPath[subPath.Length-1]) != -1) {
throw new ConfigurationErrorsException(SR.GetString(SR.Config_location_path_invalid_last_character), errorInfo);
}
// combination of URI reserved characters and OS invalid filename characters, minus / (allowed reserved character)
if (subPath.IndexOfAny(s_invalidSubPathCharactersArray) != -1) {
throw new ConfigurationErrorsException(SR.GetString(SR.Config_location_path_invalid_character), errorInfo);
}
return subPath;
}