コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 private static bool Contains(EscapeEncodingOptions options, EscapeEncodingOptions option)
 {
     return((options & option) == option);
 }