mod_perl headers_in не работает

Я использую mod_perl 2 с Apache 2.2.3 в Red Hat 5.2, и я пытаюсь получить доступ к заголовкам запроса, но Apache2 :: RequestRec headers_in (точнее, его возвращаемое значение) ведет себя не так, как я ожидал.

Фрагмент кода:

$logger->warn('version ' . $mod_perl::VERSION);
$logger->warn('r ' . $r);
my $headers = $r->headers_in;
$logger->warn('headers ' . $headers);
my $accept = $headers->get('Accept');
$logger->warn('got $accept');
$logger->warn($accept);

дает следующий вывод журнала:

WARN version 2.000004
WARN r Apache2::RequestRec=SCALAR(0x2ae0598e9ef0)
WARN headers APR::Table=HASH(0x2ae06cad15a0)

при этом выполнение прерывается при попытке доступа к APR :: Table. Связанный интерфейс для APR :: Table имел тот же эффект - то есть изменение строки get('Accept') на:

my $accept = $headers->{Accept};

дает точно такой же вывод журнала.

Согласно приведенной выше документации:

Эта таблица доступна начиная с этапа PerlHeaderParserHandler.

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

Есть ли у кого-нибудь идеи, что я делаю не так?

Изменить: Использование Data :: Dumper на самом деле ничего не прояснило.

Код:

use Data::Dumper;
$logger->warn(Dumper($r));
my $headers = $r->headers_in;
$logger->warn($headers);
$logger->warn(Dumper($headers));
$logger->warn('have dumped $headers');

Вывод:

WARN $VAR1 = bless( do{\(my $o = '47143456365192')}, 'Apache2::RequestRec' );

WARN APR::Table=HASH(0x2ae071b06fd0)

Похоже, что попытка попасть в заголовки $ даже через Data :: Dumper приводит к остановке выполнения.

Изменить: попытка установить один из заголовков также не удалась.

$logger->warn('reset accept');
$r->headers_in->{'Accept'}= 'everything';
$logger->warn('post set accept');

останавливает вывод журнала на

WARN reset accept

точка. Я попробовал и альтернативу set(Accept => 'everything') с тем же результатом.


person Cebjyre    schedule 05.04.2009    source источник
comment
Что находится в объекте $ headers? Можете ли вы показать вывод Data :: Dumper?   -  person brian d foy    schedule 05.04.2009


Ответы (3)


Есть что-нибудь в логах apache? Кажется, если ваш код перестает выполняться, где-то должна быть ошибка, объясняющая, почему.

person kbosak    schedule 06.04.2009
comment
Эти предупреждения заносятся в журнал ошибок - после записанного мной вывода журнала больше ничего нет. - person Cebjyre; 07.04.2009

Обнаружена проблема:

Мне нужно было добавить

use APR::Table;

где-то. Как-то странно, что удалось создать объект APR :: Table.

person Cebjyre    schedule 08.04.2009

Вы пробовали получить заголовок Accept без присвоения объекта заголовка $ header:

my $accept = $r->headers_in->get('Accept');

Это работает в моем коде, работающем на этапе PerlResponseHandler.

person neomorphic    schedule 07.04.2009
comment
Именно так я изначально пытался получить к нему доступ, я разделил его, чтобы было понятнее, какая часть вызывает проблемы. - person Cebjyre; 08.04.2009