Как я могу установить заголовок Cache-Control для каждого ответа в Catalyst? - PullRequest
5 голосов
/ 24 июля 2009

Похоже, что по умолчанию Catalyst не выводит заголовки Cache-Control: и т. Д. Я знаю, что могу вывести их в заданном методе контроллера следующим образом:

$c->response->headers->last_modified(time);
$c->response->headers->expires(time + $self->{cache_time});
$c->response->headers->header(cache_control => "public, max-age=$self->{cache_time}");

Хотя это будет довольно болезненно делать в каждом методе! Что бы я предпочел:

  • Набор заголовков по умолчанию (истекает сейчас, последний раз изменен сейчас, контроль кэша: без кэширования, прагма: без кэширования)
  • Aспособ для каждого метода переопределить значение по умолчанию.

Есть ли хороший способ сделать это?

Ответы [ 2 ]

6 голосов
/ 24 июля 2009

Дероберт:

Отличный вопрос. Я описал это в статье для календаря появления Catalyst.

По сути, вы создаете переменную stash, которая определяет время вашего кэша для данного действия, а затем обрабатываете его в своей процедуре завершения корневого каталога. См. Статью для всех деталей.

JayK

3 голосов
/ 24 июля 2009

Обновление: Основываясь на вашем ответе на мое предыдущее предложение, я решил укусить пулю и посмотреть на документы Catalyst. Мне кажется, место для этого:

  sub end : Private {
    my ( $self, $c ) = @_;

    # handle errors etc.

    if ( $c->res->body ) {
        if ( "some condition" ) {
            set_default_response_headers( $c->response->headers );
            return;
        }
        else {
            do_something_else();
            return;
        }
    }
    $c->forward( 'MyApp::View::TT' ); # render template
}

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

sub set_default_response_headers {
    my ($h) = @_;
    $h->last_modified(time);
    $h->expires(time + $self->{cache_time});
    $h->header(cache_control => "public, max-age=$self->{cache_time}");
    return $h;    
}

Позвонить с set_default_response_headers( $c->response->headers ).

...