226 IM Used
Применение
Ответ 226 IM Used сообщает клиенту, что тело содержит изменённую версию ресурса, а не полное представление. Один из распространённых случаев применения — дельта-кодирование, при котором передаются только различия между кэшированной и текущей версиями, что экономит трафик.
Сервер применяет манипуляции над экземплярами (instance manipulations), поддержку которых клиент объявил через запросный заголовок A-IM. Принятые манипуляции перечисляются в одной строке через запятую либо в нескольких строках.
Кэширование
Ответ 226 IM Used подчиняется правилам дельта-кэширования, определённым в его собственной спецификации, а не стандартному эвристическому списку кэширования. Ответ пригоден для использования вместе с кэшированным базовым экземпляром для построения записи кэша текущего экземпляра; стандартные директивы Cache-Control продолжают действовать, когда они присутствуют.
Неизменённый текущий экземпляр не всегда доступен напрямую. Восстановление полного ресурса требует объединить ответ 226 с ранее закэшированным базовым экземпляром, руководствуясь манипуляциями над экземплярами, которые применил сервер.
Пример
Клиент начинает с пустым кэшем и запрашивает PDF-файл. Заголовок Accept-Encoding сигнализирует о поддержке сжатия gzip. Сервер отвечает полным файлом в кодировке gzip и статусом 200.
При следующем запросе клиент проверяет, изменился ли документ, отправляя значение ETag из первого ответа в заголовке If-None-Match. Клиент также объявляет поддержку дельта-кодирования vcdiff через заголовок A-IM.
Сервер обнаруживает, что ресурс изменился со времени исходного ETag, и формирует дельта-файл. Для неизменённого ресурса вместо этого возвращается 304. Заголовок Delta-Base в ответе указывает, относительно какой кэшированной версии вычислена дельта. Заголовок IM перечисляет применённые манипуляции над экземплярами.
Запрос
GET /livingdocs/current_specs.pdf HTTP/1.1
Host: example.com
Accept-Encoding: gzip
Ответ
HTTP/1.1 200 OK
ETag: "1234-000"
Content-Encoding: gzip
<gzip-compressed file>
Запрос (последующий)
GET /livingdocs/current_specs.pdf HTTP/1.1
Host: example.com
If-None-Match: "1234-000"
Accept-Encoding: gzip
A-IM: vcdiff
Ответ (дельта)
HTTP/1.1 226 IM Used
ETag: "1234-111"
Delta-Base: "1234-000"
Content-Encoding: gzip
IM: vcdiff
<gzip-compressed delta file>
Примеры кода
.NET
HttpStatusCode.IMUsed
Rust
http::StatusCode::IM_USED
Rails
:im_used
Go
http.StatusIMUsed
Symfony
Response::HTTP_IM_USED
Python3.5+
http.HTTPStatus.IM_USED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_IM_USED
Angular
@angular/common/http/HttpStatusCode.ImUsed