Проблемное кеширование со стойкой

Я пытаюсь кэшировать ответ от сервера локально для примера, показанного здесь.

#!/usr/bin/env ruby

require 'restclient/components'
require 'rack/cache'
RestClient.enable Rack::Cache,
                  :metastore => 'file:/tmp/cache/meta',
                  :entitystore => 'file:/tmp/cache/body',
                  :verbose => true
RestClient.get 'http://www.google.com/intl/en/policies/privacy/?fg=1'

Почему-то я всегда получаю мисс в ответ, а папка пуста. Я думаю, кэширование не работает для меня. Что я делаю неправильно?

cache: [GET /intl/en/policies/privacy/?fg=1] miss

Обновить

Заголовок ответа содержит:

Cache-Control: must-revalidate, private, max-age=0 

Поэтому я думаю, что мой вопрос заключается в том, как перехватить ответ до его обработки и изменить поля заголовка ответа?

1 ответ

Rack::Cache "соответствует стандартам", что в данном случае означает, что он обращает внимание на заголовки кеша. У него есть опция allow_reload, но это не поможет с конкретным заголовком, который вы видите.

Таким образом, чтобы использовать Rack::Cache, вам нужно либо сначала перехватить запрос, возможно, с помощью обезьяньей патч Rack::Cache, либо вам нужно форк Rack::Cache, чтобы разрешить желаемое поведение. Я бы не стал делать ни одного из них здесь.

В этом случае я бы рекомендовал не использовать Rack::Cache, а вместо этого напрямую писать очень простой кэш, основанный на необработанном RestClient. Проверьте свежесть кэша и отправляйте запрос только в случае необходимости.

Другие вопросы по тегам