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

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

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

 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)

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

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