Исключения из разбора файлов без кавычек в Apache2 - PullRequest
0 голосов
/ 15 ноября 2011

Я использую 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, чтобы не рвать об этом (я ничего не смогу найти) или о какой-то другой яркой идее, которую мне не хватает.

Ответы [ 2 ]

0 голосов
/ 31 мая 2012

Я столкнулся с той же проблемой, и вы можете найти решение здесь:

«Ожидаемый токен отсутствует» в моем журнале Apache

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

(да, это могло быть учтено, но, откровенно говоря, код настолько прост, что в этом не было необходимости).

Я бы воспользовался этой возможностью, чтобы исправить этот упущение вместосоздание другого

Если вы настаиваете, вы могли бы чему-то научиться у 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};
 }
...