Param导致Catalyst中的“不映射到Unicode”错误

时间:2014-12-23 16:54:00

标签: perl 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在尝试修复此错误时失败了。我不能阻止用户输入这样的查询字符串。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

URL假设使用UTF-8编码。 RFC3986:

  

当新的URI方案定义表示由通用字符集中的字符组成的文本数据的组件时,应首先根据UTF-8字符编码将数据编码为八位字节;那么只有那些与未保留集中的字符不对应的八位字节应该是百分比编码的。

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。您可以使用handle_unicode_encoding_exception()覆盖Catalyst的默认错误处理行为(例如,提供更精确的错误页面)。

答案 1 :(得分:1)

因此,Catalyst.pm中有一个方法可以在子类中修改(上例中的Hello.pm),它控制错误的外观。如果您想对这些类型的错误感到惊讶,您可以这样做。看看:

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

如果愿意,可以覆盖该方法。

或者,如果您有代码更改或某种配置选项的提议,您可以分支Catalyst github repo并向我发送一个包含您的想法的拉取请求:

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

这些方法目前被认为是私有的,但我正在考虑将它们完全公开。