#ruby #open-uri
#ruby #open-uri
Вопрос:
К сожалению, мне приходится опрашивать конечную точку и обновлять другую систему при изменении данных. Я написал цикл (с инструкцией, чтобы я не запускал сервер) sleep
:
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.
Комментарии:
1. Как вы можете узнать, что на сервере обновлено содержимое, если вы получаете кэшированное содержимое? Вы можете попросить сервер не использовать свой кэш, но он не обязан учитывать ваш запрос, и в этом случае он не учитывает заголовки кэша в запросе. Подробнее на 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 }
по-прежнему получает кэшированное содержимое.2. Когда я перезагружаю ту же конечную точку в веб-браузере, я вижу новое содержимое.
Ответ №1:
Это может быть проблемой на самом веб-сайте Drupal 8, поскольку у него есть свой собственный менеджер кэша — и кажется, что где-то есть кэш для каждого пользователя, если у вас есть новый контент с помощью веб-браузера.
Легко увидеть, от каких контекстов кэша зависит определенная страница и какие теги кэша делают ее недействительной: нужно только взглянуть на заголовки X-Drupal-Cache-Contexts и X-Drupal-Cache-Tags !
Но эти заголовки недоступны в вашем списке. Если вы поддерживаете связь с разработчиками веб-сайта, попросите их сделать следующее:
Вы можете отлаживать кэшируемые ответы (ответы, реализующие этот интерфейс, которые могут кэшироваться кешем страницы или динамическим кешем страницы), установив для параметра контейнера http.response.debug_cacheability_headers значение true в вашем services.yml. Затем следует перестройка контейнера, которая необходима при изменении параметра контейнера.
Это приведет к тому, что Drupal отправит заголовки X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts.