Этаг - это произвольная строка, которую сервер отправляет клиенту, которую клиент отправит обратно на сервер при следующем запросе файла.
Этаг должен быть вычисляемым на сервере в зависимости от файла. Вроде как контрольная сумма, но вы, возможно, не захотите проверять контрольную сумму каждого файла, отправляющего ее.
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)
Я собрал строку в формате «номер файла / даты / размер файла». Таким образом, если файл был изменен на сервере после того, как он был передан клиенту, вновь сгенерированный etag не будет совпадать, если клиент повторно запросит его.
char *mketag(char *s, struct stat *sb)
{
sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
return s;
}