我使用Apache2::Cookie(即Apache2与mod_perl)来解析Cookie。
my %cookies = Apache2::Cookie->fetch;
do_something($cookies{"cookie1"});
此代码已在生产环境中运行多年,没有任何问题。我刚刚了解到,具有特定格式的cookie会导致抛出异常Expected token not present
。这个cookie是由客户端JavaScript生成的:
document.cookie = "val=a,b"
Apache2::Cookie似乎不喜欢逗号。
我可以用eval
捕获这个错误,但是cookie检索是在代码中的许多地方完成的(是的,它可以被分解出来,但坦率地说,代码非常简单,没有必要)。在任何情况下,它现在在那里,我必须跟踪并捕获这个cookie的异常,我没有设置,我不需要
是否有一种更简单的方法来摆脱这种异常,而不是重构几十个对Apache2::Cookie->fetch
的调用?通过重新定义Apache2::Cookie::fetch
,或者通过为libapreq
设置一个全局标志而不是在此呕吐(没有任何我可以找到),或者我错过的其他一些聪明的想法。
(是的,它可以被分解,但坦率地说,代码太简单了,没有必要)。
我会抓住这个机会改正这个疏忽,而不是制造另一个
如果你坚持的话,你可以从CGI::Cookie中学习一些东西
sub fetch {
my $class = shift;
my $raw_cookie = get_raw_cookie(@_) or return;
return $class->parse($raw_cookie);
}
sub get_raw_cookie {
my $r = shift;
$r ||= eval { $MOD_PERL == 2 ?
Apache2::RequestUtil->request() :
Apache->request } if $MOD_PERL;
return $r->headers_in->{'Cookie'} if $r;
die "Run $r->subprocess_env; before calling fetch()"
if $MOD_PERL and !exists $ENV{REQUEST_METHOD};
return $ENV{HTTP_COOKIE} || $ENV{COOKIE};
}
我也遇到过同样的问题,你可以在这里找到解决方案:
Apache日志中出现" Expected token not present "错误