2014-12-23 8 views
3

Следующая продемонстрирует ошибку:Param вызывает «не отображает в Unicode» ошибка в Catalyst

catalyst.pl Hello 
cd Hello 
echo "encoding utf8" >> hello.conf 
script/hello_server.pl -r 

Затем перейдите к http://localhost:3000/?q=P%E9rl в вашем браузере и вы получите 400 Bad Request.

Это, по-видимому, метод Catalyst _handle_param_unicode_decoding(), который генерирует эту ошибку. Учитывая, что эта ошибка является тривиальной для генерации, она появляется в журналах ошибок, и Google не смог меня исправить эту ошибку. Я не могу запретить пользователям вводить такие строки запроса. Как я могу обойти это?

+0

В UTF-8% -кодированные данные% E9 действительно недействительны (не являются действительными символьными данными или их началом), так что вы думаете, что * должно произойти? –

ответ

3

URL-адреса должны кодироваться с использованием UTF-8. RFC3986:

When a new URI scheme defines a component that represents textual data consisting of characters from the Universal Character Set, the data should first be encoded as octets according to the UTF-8 character encoding; then only those octets that do not correspond to characters in the unreserved set should be percent-encoded.

P E9 r l не является допустимым UTF-8.

Я считаю, что вы шли на Pérl (é U + 00E9)? Это будет

$ perl -Mutf8 -MURI::Escape -E'say uri_escape_utf8("Pérl")' 
P%C3%A9rl 

400 Bad Request является подходящей ошибкой для предоставления неправильного URL-адреса. Если пользователь не хочет видеть эту ошибку, они должны использовать действительный URL-адрес. Вы можете переопределить поведение обработки ошибок по умолчанию Catalyst (например, чтобы предоставить более точную страницу ошибок) с помощью handle_unicode_encoding_exception().

+0

Я продолжаю забывать, что коды с 128 по 255 являются многобайтовыми. – Ovid

+0

Чем больше я об этом думаю, тем больше я понимаю, что это все еще плохо. Многие URL-адреса этого приложения (и еще один, над которым я работаю) предназначены для запросов GET, которые не принимают никаких параметров, поэтому мне очень хотелось бы * не * убить приложение из-за плохих данных, которые я не собираюсь использовать в любом случае. – Ovid

+0

Действительно? Похоже, вы говорите о веб-интерфейсе API. Я думаю, что лучше поймать плохого клиента раньше, чем позже. – ikegami

1

Таким образом, в Catalyst.pm есть метод, который вы можете изменить в своем подклассе (Hello.pm в приведенном выше примере), который определяет, как выглядят ошибки. Если вы хотите удивить эти ошибки, вы можете это сделать. Посмотрите на:

https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90077/lib/Catalyst.pm#L3108

вы можете переопределить этот метод, если вам нравится.

В качестве альтернативы, если у вас есть предложение по изменению кода или какой-то вариант конфигурации вы можете переходить от катализатора GitHub репо и отправить мне запрос тянуть с вашими идеями:

https://github.com/perl-catalyst/catalyst-runtime

Эти методы в настоящее время считается несколько приватным, но я рассматриваю возможность их полной рекламы.