В 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
};
При двух слегка отличающихся сценариях возникают две проблемы:
- Если запрос приходитв
/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/
.