Проблемное кеширование со стойкой
Я пытаюсь кэшировать ответ от сервера локально для примера, показанного здесь.
#!/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. Проверьте свежесть кэша и отправляйте запрос только в случае необходимости.