2010-06-25 16 views
11

J'ai une méthode dans mon contrôleur qui utilise send_data comme ceci:Comment puis-je configurer Expire: en-tête lors de l'utilisation send_data

def show 
    expires_in 10.hours, :public => true 
    send_data my_image_generator, :filename => "image.gif", :type => "image/gif" 
end 

En utilisant expires_in résultats en-têtes sont envoyés comme ceci:

HTTP/1.1 200 OK 
Connection: close 
Date: Fri, 25 Jun 2010 10:41:22 GMT 
ETag: "885d75258e9306c46a5dbfe3de44e581" 
Content-Transfer-Encoding: binary 
X-Runtime: 143 
Content-Type: image/gif 
Content-Disposition: inline; filename="image.gif" 
Content-Length: 1277 
Cache-Control: max-age=36000, public 

Ce que je voudrais faire est d'ajouter un en-tête comme Expires: (some exact date) pour empêcher l'agent utilisateur de revalider. Mais je ne vois pas comment faire send_data définir cet en-tête?

Je suppose que pourrait le définir explicitement dans le hachage response.headers, mais sûrement il doit y avoir un wrapper pour cela (ou quelque chose)?

Répondre

10

Apparemment, il semble y avoir aucun moyen de passer expire à send_data - au lieu que vous devez définir vous-même dans response.headerset prendre soin de mettre en forme la date appropriée:

response.headers["Expires"] = CGI.rfc1123_date(Time.now + period) 

Notez que la directive max-age dans la Cache-Control En-tête remplace l'en-tête Expires si les deux sont présents. Voir RFC2616 Section 14.9.3 pour plus de détails.

27

je suis tombé sur cette syntaxe et je l'aime :-)

response.headers["Expires"] = 1.year.from_now.httpdate 
+2

qui est beaucoup plus cool: P – conny

+0

Est-ce que vous mettez que dans avant ou après le send_data? – 0112

+0

Ajouter avant 'send_data'; une fois que 'send_data' est appelé, il est inutile de définir les en-têtes. – Abdo

3

Le code dans votre question devrait effectivement travailler sur les récents Rails:

`expires_in 10.hours, :public => true` 
+4

N'est-ce pas exactement ce que le demandeur fait dans son code d'origine? – bredikhin

+0

En fait, j'ai trouvé que cela fonctionne sur Rails 4.2, Rails peut-être corrigé un bug? Assurez-vous simplement d'éviter d'utiliser des en-têtes manuels dans la même méthode. Il a l'avantage supplémentaire de vous permettre de le déclarer public. – mahemoff