Почему некоторая информация заголовка в объекте CGI.pm сохраняется, а другая нет? - PullRequest
1 голос
/ 22 ноября 2010

Мы с коллегами поддерживаем и развиваем веб-проект 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. Это требуется только для определенной функции.

1 Ответ

0 голосов
/ 18 марта 2011

Чтобы ответить на ваш вопрос, метод заголовка не хранит никакой информации, ничто не является постоянным.

С вашим примером сохраняющегося заголовка 'object', чтение TFM помогает:

Параметр -charset можно использовать для управления набором символов, отправляемых в браузер.Если не указано, по умолчанию используется ISO-8859-1. В качестве побочного эффекта также устанавливается метод charset () .[выделение мое]

После вызова заголовка с некоторыми параметрами, а затем вызова его по умолчанию, единственное, что нужно сохранить - это набор символов.

Для проблемы с cookie,Я думаю, вам нужно хранить $ response-> cookie ();где-то. TFM не говорит о том, что подсистема cookie () хранит данные где-либо, а просто говорит, что создает cookie.

Хотя я согласен с Синаном - выбрасывать исключения - сумасшедший разговор, особенночтобы покрыть переадресацию CGI.pm.Я бы переосмыслил это.Или идите полностью другим путем и напишите весь веб-приложение только с использованием обработки исключений - по пути будет хороший смех: o)

...