Отключить кеширование в open-uri

К сожалению, мне приходится опрашивать конечную точку и обновлять другую систему при изменении данных. Я написал цикл (с оператором sleep, чтобы не запускать сервер в DOS):

require 'nokogiri'
require 'open-uri'

desired_data = 'foo'
data = nil
url = nil

while data != desired_data do
  sleep(2)
  url = "https://elections.wi.gov/index.php/elections-voting/statistics"
  doc = Nokogiri::HTML.parse(open(url))

  puts doc

  # do some nokogiri stuff to extract the information I want.

  # store information to `data` variable.
end

# if control is here it means the data changed

Это работает нормально, за исключением случаев, когда сервер обновляется, open(url) по-прежнему возвращает старый контент (даже если я перезапускаю скрипт).

Похоже, что в игре может быть какое-то кеширование. Как отключить его?

Вот возвращенные заголовки HTTP:

HTTP/2 200
date: Fri, 02 Oct 2020 14:00:44 GMT
content-type: text/html; charset=UTF-8
set-cookie: __cfduid=dd8fca84d468814dd199dfc08d45c98831601647244; expires=Sun, 01-Nov-20 14:00:44 GMT; path=/; domain=.elections.wi.gov; HttpOnly; SameSite=Lax; Secure
x-powered-by: PHP/7.2.24
cache-control: max-age=3600, public
x-drupal-dynamic-cache: MISS
link: <https://elections.wi.gov/index.php/elections-voting/statistics>; rel="canonical"
x-ua-compatible: IE=edge
content-language: en
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
expires: Sun, 19 Nov 1978 05:00:00 GMT
last-modified: Fri, 02 Oct 2020 12:47:38 GMT
vary: Cookie
x-generator: Drupal 8 (https://www.drupal.org)
x-drupal-cache: HIT
x-speed-cache: HIT
x-speed-cache-key: /index.php/elections-voting/statistics
x-nocache: Cache
x-this-proto: https
x-server-name: elections.wi.gov
access-control-allow-origin: *
x-xss-protection: 1; mode=block
cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
cf-cache-status: DYNAMIC
cf-request-id: 058b368b9f00002ff234177200000001
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 5dbef38c3b6a2ff2-ORD```

If it matters, I’m using Ruby 2.7 on macOS Big Sur. 

person Aaron Brager    schedule 02.10.2020    source источник
comment
Как узнать, что сервер обновил контент, если вы получаете кешированный контент? Вы можете попросить сервер не использовать свой кеш, но он не обязан учитывать ваш запрос, и в этом случае он не учитывает заголовки кеша в запросе. Подробнее на developer.mozilla.org/en-US/ docs/Web/HTTP/Headers/Cache-Control и ruby-doc.org/stdlib-2.5.1/libdoc/open-uri/rdoc/OpenURI.html. В этом случае что-то вроде open(url, 'Cache-Control' => 'no-cache') { |f| p f.meta } по-прежнему получает кешированный контент.   -  person anothermh    schedule 02.10.2020
comment
Когда я перезагружаю ту же конечную точку в веб-браузере, я вижу новый контент.   -  person Aaron Brager    schedule 03.10.2020


Ответы (1)


Это может быть проблемой на самом веб-сайте Drupal 8, поскольку у него есть собственный менеджер кеша — и кажется, что где-то есть кеш для каждого пользователя, если у вас есть новый контент с использованием веб-браузера.

Легко увидеть, какими контекстами кэша отличается определенная страница и какими тегами кэша она признана недействительной: достаточно посмотреть заголовки X-Drupal-Cache-Contexts и X-Drupal-Cache-Tags!

Но эти заголовки недоступны в вашем списке. Если вы связались с разработчиками веб-сайта, попросите их сделать следующее:

Вы можете отлаживать кешируемые ответы (ответы, реализующие этот интерфейс, которые могут кэшироваться с помощью Page Cache или Dynamic Page Cache), установив для параметра контейнера http.response.debug_cacheability_headers значение true в файле services.yml. Далее следует перестроение контейнера, необходимое при изменении параметра контейнера.

Это заставит Drupal отправлять заголовки X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts.

person MacSim    schedule 04.10.2020