226 IM Used
사용법
226 IM Used 응답은 본문에 표현 전체가 아니라 변형된 버전의 리소스가 들어 있음을 클라이언트에 알립니다. 흔한 용도 하나는 델타 인코딩으로, 캐시된 버전과 현재 버전 사이의 차이만 전송하여 대역폭을 절약합니다.
서버는 클라이언트가 A-IM 요청 헤더로 지원을 선언한 인스턴스 조작을 적용합니다. 수용 가능한 조작은 쉼표로 구분된 한 줄에 나열하거나 여러 줄에 걸쳐 나열합니다.
캐싱
226 IM Used 응답은 표준 휴리스틱 캐싱 목록이 아니라, 자체 명세에 정의된 델타 캐싱 규칙을 따릅니다. 이 응답은 캐시된 기준 인스턴스와 함께 현재 인스턴스에 대한 캐시 항목을 구성하는 데 사용할 수 있으며, 표준 Cache-Control 지시문도 존재할 경우 그대로 적용됩니다.
변형되지 않은 현재 인스턴스를 항상 바로 얻을 수 있는 것은 아닙니다. 전체 리소스를 재구성하려면 서버가 적용한 인스턴스 조작을 지침 삼아 226 응답과 이전에 캐시된 기준 인스턴스를 결합해야 합니다.
예시
클라이언트는 빈 캐시 상태에서 PDF 파일을 요청합니다. Accept-Encoding 헤더는 gzip 압축을 지원함을 알립니다. 서버는 gzip으로 인코딩된 파일 전체와 200 상태로 응답합니다.
다음 요청에서 클라이언트는 첫 응답의 ETag 값을 If-None-Match 헤더에 담아 문서가 변경되었는지 확인합니다. 또한 A-IM 헤더로 vcdiff 델타 인코딩 지원을 선언합니다.
서버는 원래 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