2009-07-24 9 views
5

Sembra che per impostazione predefinita Catalyst non emetta intestazioni Cache-Control:, ecc. So che posso uscita loro in un dato metodo di controllo in questo modo:Come posso impostare l'intestazione Cache-Control per ogni risposta in Catalyst?

$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}"); 

Si otterrebbe abbastanza doloroso farlo in ogni metodo, però! Quello che preferisco è:

  • un insieme predefinito di intestazioni (scade oggi, ultima ora, cache-control modificato: no-cache, Pragma: no-cache)
  • Un modo per, per-metodo , sostituisci il valore predefinito.

C'è un buon modo per realizzare questo?

risposta

6

derobert:

Ottima domanda. Ho coperto esattamente questo in un article per il calendario dell'avvento Catalyst.

Fondamentalmente si crea una variabile stash che definisce il tempo di cache per l'azione specificata e quindi la si processa nella routine Root end. Vedi l'articolo per tutti i dettagli.

JayK

+2

Puoi includere un breve snippet in questa risposta. –

+0

Quella wiki non si sta caricando per me al momento (pagina vuota o reset della connessione), ma posso lavorare con questa idea. Grazie. E posso semplicemente impostarlo su no-cache se non ne è impostato uno. Incredibile questo non è integrato in Catalyst; sembra che ogni app Catalyst debba fare questo! – derobert

+0

Ok, il wiki è di nuovo disponibile. Questo è un approccio davvero carino. Questo dovrebbe essere parte di Catalyst, o almeno di un plugin .... – derobert

3

Aggiornamento: Sulla base della risposta al mio precedente suggerimento, ho deciso di mordere il punto e guardare i documenti Catalyst. Mi sembra, il posto giusto per farlo è in:

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 
} 

risposta precedenza: Non faccio uso di Catalyst, ma non poteva semplicemente scrivere un sub per la vostra applicazione?

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;  
} 

Chiama con set_default_response_headers($c->response->headers).

+0

Sì, potrei scrivere un sub, ma poi devo ancora ricordarsi di chiamare in ogni metodo ... e se viene dimenticato in qualsiasi metodo di controllo, che porta ad una probabile bug. Sembra un approccio piuttosto fragile – derobert

Problemi correlati