HTTP: создание заголовка ETag

etag — это произвольная строка, которую language-agnostic сервер отправляет клиенту, которую http-etag клиент отправит обратно на headers сервер при следующем запросе http файла.

etag должен вычисляться webserver на сервере на основе файла. Вроде headers как контрольная сумма, но headers вы можете не захотеть проверять http-etag контрольную сумму каждого http отправляемого файла.

 server                client
 
        <------------- request file foo
 
 file foo etag: "xyz"  -------->
 
        <------------- request file foo
                       etag: "xyz" (what the server just sent)
 
 (the etag is the same, so the server can send a 304)

Я создал http-etag строку в формате "дата-размер http-etag файла-номер индексного дескриптора http файла". Таким образом, если headers файл изменяется на сервере http-etag после того, как он был передан etag клиенту, вновь сгенерированный webserver etag не будет совпадать, если header клиент повторно запросит http-etag его.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d-%d-%d", sb->st_mtime, sb->st_size, sb->st_ino);
    return s;
}

language-agnostic

http

webserver

header

etag

2022-10-02T17:24:37+00:00