Кэшируйте HTTP-ответ, несмотря на заголовок «no-cache» в ответе - PullRequest
0 голосов
/ 12 июня 2019

Мой бэкэнд делает запросы к стороннему REST API. Я хочу кешировать запросы, чтобы не превышать ограничения по скорости. Однако сторонний API возвращает заголовки, которые инструктируют мой уровень кэширования (совместимый с RFC 7234) не кэшировать. Есть ли какой-либо совместимый со стандартами способ проинструктировать мой уровень кэширования игнорировать директивы, указанные в ответе?

Мой бэкэнд находится в Node.js, и я пробовал слой кэширования cacheable-request . Я делаю запросы с заголовком Cache-Control: public, max-stale=900 с целью предоставления устаревших данных в течение 15 минут. Это работает, если я вызываю API, который не возвращает связанных с кэшем заголовков ответов. Однако настоящий сторонний API возвращает следующие заголовки:

cache-control: no-store, no-cache, must-revalidate
expires: Thu, 01 Jan 1970 00:00:00 UTC
date: Wed, 12 Jun 2019 13:53:07 GMT
pragma: no-cache
vary: Accept-Encoding

И это, кажется, препятствует тому, чтобы мой слой кэширования включился.

Решение должно быть избыточным и способным к развертыванию в Kubernetes. Я в порядке, обслуживаю устаревшие данные до тех пор, пока могу аннулировать их всякий раз, когда пользователи совершают мутации или я получаю перехват событий от стороннего производителя. Я ожидаю найти решение, которое является достаточно общим и не требует от меня подлинной репликации и сохранения сторонней структуры данных в моем собственном бэкэнде.

1 Ответ

0 голосов
/ 12 июня 2019

Поскольку cacheable-request принимает любой http.request API-совместимый метод, вы можете создать свой собственный http.request -совместимый метод, удалить заголовок cache-control и обернуть этот метод в cacheable-request.

Пример кода будет выглядеть так:

const http = require('http');
const CacheableRequest = require('cacheable-request');

let withCacheHTTPRequestWrapper = function() {
  let originalCallback = arguments[arguments.length-1];

  let parameters = [];
  for (let i=0; i<arguments.length-1; i++) {
    parameters.push(arguments[i]);
  }
  let stripCacheHeaderCallback = function(res) {
    delete res.headers['cache-control'];
    // need to remove cache-control from res.rawHeaders too
    originalCallback(res);
  };
  parameters.push(stripCacheHeaderCallback);

  return http.request.apply(this, parameters);
};

// Example below
let req = withCacheHTTPRequestWrapper('http://example.com', function(response){
  // no "cache-control" in response now.
});
req.end();

// Wrap with cacheable-request
const cacheableRequest = new CacheableRequest(withCacheHTTPRequestWrapper);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...