HTTP-запрос декодирования XQuery - невозможно проанализировать запрос - PullRequest
0 голосов
/ 15 ноября 2018

В XQuery 3.1 (в eXist-db 4.4) я получаю поисковые запросы к контроллеру, где я создаю параметр docset из строки запроса URL-адреса text:

else if (starts-with(lower-case($exist:path), "/search")) then
  <dispatch xmlns="http://exist.sourceforge.net/NS/exist">
    <forward url="{$exist:controller}/search.html"/>
      <view>
        <forward url="{$exist:controller}/modules/view.xql">
          <add-parameter name="docset" 
                  value="{search:search-term-cleaner(request:get-parameter("text","norequest"))}"/> 
          <add-parameter name="pagetype" value="search"/>
        </forward>
      </view>
  </dispatch>

Я очищаю любыевходящие такие запросы на /search?text="" разрешают только определенные символы в поисковом запросе:

declare function search:search-term-cleaner($text as xs:string?) as xs:string?
{
    let $cleanterm := replace($text,'[^A-Za-z\+*0-9]', '')

    return $cleanterm
};

При двух слегка отличающихся сценариях возникают две проблемы:

  1. Если запрос приходитв /search?text=some%+text сайт жалуется с помощью

org.eclipse.jetty.http.BadMessageException: 400: невозможно проанализировать URI-запрос java.lang.IllegalArgumentException: недопустимая кодировка '% + t'

Если запрос приходит /search?text=some+text, контроллер проходит через sometext без разрешенного + знака

Поиск в Google не привел меня к решению, но у меня нет опыта в управлении разбором HTTP и, возможно, я недостаточно разбираюсь в проблеме, чтобы найти решение.

Это через локальный хост http://localhost:8081/exist/apps/.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

При получении параметров через request:get-parameter() вам не нужно удалять параметры, закодированные в URI.%20 и + автоматически передаются вам как пробельные символы.

0 голосов
/ 15 ноября 2018

функции, такие как util:unescape-uri и escape-uri ваши друзья.Поскольку строка, с которой вы работаете, отправляется через http, она будет экранирована.Вы можете узнать больше о доступных экранирующих функциях, выполнив поиск escape в документации по

, для более сложных операций рассмотрите normalize-unicode

...