Отправить файл из строки в памяти, но по-прежнему включать в себя функцию etag - PullRequest
0 голосов
/ 14 мая 2018

У меня есть кешированный файл в памяти.Насколько я знаю, это в основном то, как etags используются сервером:

const fileInMemory = '...';

if(fileHasChanged()){
   res.status(200);
   res.write(fileInMemory);
   res.end();

else{
   res.status(304);
   res.end();
}

Кто-нибудь знает, как на самом деле реализовать etaging?Как сравнить заголовок etag из запроса со строкой fileInMemory?Это всего лишь байты?

Я считаю, res.sendFile(), и эти методы отвечают за генерацию информации etag, поэтому мне, возможно, придется погрузиться в источник.

Я считаю, что большая часть соответствующего кодаздесь: https://github.com/expressjs/express/blob/master/lib/response.js

хотя я не понял, откуда взялась req.fresh: https://github.com/expressjs/express/blob/master/lib/response.js#L206

1 Ответ

0 голосов
/ 14 мая 2018

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

Серверы, которые не знают природу полезной нагрузки, обычно используют хеш полезной нагрузки. В вашем примере вы можете (предварительно) вычислить sha256(fileInMemory) и использовать его (или некоторую его часть) в качестве тега сущности.

Серверы, которые действительно знают природу полезной нагрузки, используют множество других тактик, таких как проверка версии полезной нагрузки, хранящейся в некоторой серверной базе данных. В вашем примере, если ваша программа имеет некоторый связанный номер версии, и fileInMemory никогда не изменяется в пределах одной версии, этот номер версии может работать как тег сущности.

Кстати, обратите внимание, что тег сущности всегда должен быть заключен в двойные кавычки: так что

ETag: "9c314d58"

а не

ETag: 9c314d58
...