Передача регулярных выражений через кодировку URL

0

Я пытаюсь передать регулярные выражения от клиента к серверу, используя стороннюю клиентскую сторону Angular JS и сервер Nancy FX. У меня возникла особая проблема с символом "+". В настоящее время я явно кодирую "+" как клиентскую сторону "%2B":

    this.getMatchingPoints = function (stringMatch) {
        console.log("Application Points Service: getPointsMatching('" + stringMatch + "')");
        /* we have a particular problem with the character '+' in regular expressions, since
         * encodeURIComponent ignores it, and urldecoders treat it as a space. So it must be
         * manually url encoded after passing the rest of the string to encodeURIcomponent */
        var encodedPattern = encodeURIComponent(stringMatch).replace('+', '%2B');
        return $http.get('/Json/PointsMatching/' + encodedPattern);
    };

... но он по-прежнему принимается как сторона космического сервера.

В некотором смысле это не имеет большого значения, учитывая, что любой экземпляр, например, "[AZ] +" в регулярном выражении может быть заменен на "[AZ] [AZ] * '; или, в качестве альтернативы, я мог бы написать свой собственный специальный кодер для "+" клиентской стороны со своей собственной специальной стороной сервера декодера.

Но мне интересно, сталкивался ли кто-либо с этой проблемой раньше, и если да, то как они ее решили?

Теги:
nancy

1 ответ

0

Немного больше исследований показывает, что это глубокая и трудная для устранения ошибка в Nancy FX, о которой разработчики знают; см. здесь.

Мое обходное решение заключается в том, что пробелы не являются допустимыми символами в конкретном контексте, в котором я работаю, чтобы заменить все пробелы на стороне плюсов:

        /* <summary>
         *  Return a JSON formatted document comprising a list of all those application points whose 
         *  names match the regular expression.
         *  </summary>
         *  <remarks>
         *  <para>This entry point is expected to be invoked with the pattern as the final element in the path
         *  (i.e. <code>/Json/PointsMatching/pattern_here</code>). This variant cannot cope with either slashes
         *  or backslashes in the pattern, even if they're URL encoded.</para>
         *  </remarks>
         *  <param name="pattern">A regular expression.</param>
         *  <returns>A JSON formatted document comprising a list of all those application points whose 
         *  names match the regular expression.</returns>
         */
        this.Get["/PointsMatching/{pattern}"] = _ =>
        {
            string pattern = (string)_.pattern;
            /* THIS IS A HACK! The URL decoder used by Nancy decodes both '+' and '%2B' as ' ', which
             * rather defeats the point of url encoding. However, we don't normally use spaces in
             * application point names (although it would be valid to do so), so it fairly save to
             * replace all spaces in patterns with pluses. */
            pattern = pattern.Replace(" ", "+");

            return this.WithValidUser<string>(pattern, InterestRegistry.Instance.GetPointsMatching);
        };

Это явно уродливое, а не решение общего назначения, но оно работает пока.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню