/// <summary> /// Is allowed? /// </summary> /// <param name="options"></param> /// <param name="ch"></param> /// <returns></returns> private static bool IsAllowedChar(EscapeEncodingOptions options, char ch) { bool isUriString = (options & EscapeEncodingOptions.UriString) == EscapeEncodingOptions.UriString; bool isLegacyRfc2396 = (options & EscapeEncodingOptions.LegacyRfc2396) == EscapeEncodingOptions.LegacyRfc2396; if (isUriString) { if (!isLegacyRfc2396 && RFC3986UnreservedMarks.IndexOf(ch) >= 0) { return(true); } if (isLegacyRfc2396 && RFC2396UnreservedMarks.IndexOf(ch) >= 0) { return(true); } } else { if (!isLegacyRfc2396 && RFC3986ReservedMarks.IndexOf(ch) >= 0) { return(true); } if (isLegacyRfc2396 && RFC2396ReservedMarks.IndexOf(ch) >= 0) { return(true); } } return(false); }
/// <summary> /// Escape unicode string data for use in http-requests /// </summary> /// <param name="source">unicode string-data to be encoded</param> /// <param name="target">target for the encoded result</param> /// <param name="options"><see cref="EscapeEncodingOptions"/>s for how to perform the encoding</param> public static void EscapeDataEncode(string source, StringBuilder target, EscapeEncodingOptions options) { if (string.IsNullOrEmpty(source)) { return; } bool isLowerCaseHex = Contains(options, EscapeEncodingOptions.LowerCaseHex); bool isSpaceAsPlus = Contains(options, EscapeEncodingOptions.SpaceAsPlus); bool isNLogLegacy = Contains(options, EscapeEncodingOptions.NLogLegacy); char[] charArray = null; byte[] byteArray = null; char[] hexChars = isLowerCaseHex ? hexLowerChars : hexUpperChars; for (int i = 0; i < source.Length; ++i) { char ch = source[i]; target.Append(ch); if (IsSimpleCharOrNumber(ch)) { continue; } if (isSpaceAsPlus && ch == ' ') { target[target.Length - 1] = '+'; continue; } if (IsAllowedChar(options, ch)) { continue; } if (isNLogLegacy) { HandleLegacyEncoding(target, ch, hexChars); continue; } if (charArray == null) { charArray = new char[1]; } charArray[0] = ch; if (byteArray == null) { byteArray = new byte[8]; } WriteWideChars(target, charArray, byteArray, hexChars); } }
public static EscapeEncodingOptions GetUriStringEncodingFlags(bool escapeDataNLogLegacy, bool spaceAsPlus, bool escapeDataRfc3986) { EscapeEncodingOptions encodingOptions = EscapeEncodingOptions.UriString; if (escapeDataNLogLegacy) { encodingOptions |= EscapeEncodingOptions.LowerCaseHex | EscapeEncodingOptions.NLogLegacy; } else if (!escapeDataRfc3986) { encodingOptions |= EscapeEncodingOptions.LowerCaseHex | EscapeEncodingOptions.LegacyRfc2396; } if (spaceAsPlus) { encodingOptions |= EscapeEncodingOptions.SpaceAsPlus; } return(encodingOptions); }
private static bool Contains(EscapeEncodingOptions options, EscapeEncodingOptions option) { return((options & option) == option); }