Мы с коллегами поддерживаем и развиваем веб-проект Perl, который работает через mod_perl
.
Теперь мы проходим через рефакторинг основного унаследованного кода, в котором мы реализовали своего рода шаблон MVC.
Помимо прочего, моя задача - убедиться, что все заголовки HTTP-ответа обрабатываются и отправляются обратно в браузер внутри основного контроллера. Например, если требуется перенаправление, обработчик страницы генерирует исключение, тогда главный контроллер перехватывает его и генерирует соответствующие заголовки.
Все выглядело хорошо, пока я не начал реализовывать обработку файлов cookie. До этого наш код просто печатал заголовки cookie для вывода, когда это было необходимо, например, так:
# $response is an instance of the CGI class
print $response->redirect(
-uri => "/some_uri/",
-cookie => $response->cookie(
-name => 'user_id',
-value => $user->{'id'},
-path => '/', -expires => '+1M'));
И теперь я хочу, чтобы объект $response
сохранял эту информацию, чтобы позже я мог отправить все заголовки вместе. Я думал, что это будет примерно так:
sub page_handler {
# ...
$response->cookie(-name => 'user_id',
-value => $user->{'id'},
-path => '/', -expires => '+1M');
return;
}
# And then, inside the controller
sub controller {
# ...
# the same $response instance
print $response->header();
print $output;
# ....
exit();
}
Но кажется, что объект класса CGI
не хранит все заголовки, которые он создает с помощью метода header
. Кажется, что некоторые заголовки сохраняются, а другие нет, вот что я получаю в re.pl
:
$ use CGI;
$ my $response = CGI->new();
$CGI1 = CGI=HASH(0xa6efba0);
$ $response->header();
Content-Type: text/html; charset=ISO-8859-1
$ $response->header(-type => 'text/plain', -charset => 'UTF-8', -status => '200 OK');
Status: 200 OK
Content-Type: text/plain; charset=UTF-8
$ $response->header();
Content-Type: text/html; charset=UTF-8
Я ожидал, что последний вывод будет таким же, как предыдущий, или таким же, как первый, где я еще не установил никаких заголовков. Я не ожидал, что это изменится частично.
Вот почему я задаю свой вопрос: Почему некоторые данные заголовка в объекте CGI.pm сохраняются, а другой нет?
Я неправильно использую объект? Есть ли способ, которым я мог бы использовать его так, как я намеревался?
PS: Извините за длинный вопрос, я хотел убедиться, что вы понимаете, что я хочу сделать.
PPS: Кроме того, я знаю, что многие люди здесь рекомендуют уходить из CGI и использовать Catalyst. Боюсь, что сейчас это не вариант, потому что у нас слишком много устаревшего кода, и мы надеемся вообще отказаться от mod_perl. Это требуется только для определенной функции.