5.5 警告 (Warning)
"Warning" 头字段用于携带关于消息状态或转换的附加信息,这些信息可能没有反映在状态码中。这些信息通常用于警告由于缓存操作或应用于消息有效负载的转换而可能引入的不正确性。
警告可以用于其他目的,包括与缓存相关和无关的目的。使用警告而不是错误状态码,可以将这些响应与真正的失败区分开。
Warning 头字段通常可以应用于任何消息。但是,某些 warn-code 特定于缓存,只能由缓存在验证缓存条目时生成。
Warning = 1#warning-value
warning-value = warn-code SP warn-agent SP warn-text
[ SP warn-date ]
warn-code = 3DIGIT
warn-agent = ( uri-host [ ":" port ] ) / pseudonym
; 添加 Warning 头字段的服务器名称或假名,用于调试。
; 假名应当是生成的 hostname。
warn-text = quoted-string
warn-date = DQUOTE HTTP-date DQUOTE
可以将多个警告附加到响应(由源服务器或缓存附加),包括多个具有相同代码编号但仅 warn-text 不同的警告。
接收到一个或多个 Warning 头字段的用户代理应当(SHOULD)按照它们在响应中出现的顺序,尽可能多地将警告告知用户。
本规范定义了下述 warn-code。位于 http://www.iana.org/assignments/http-warn-codes 的 "Warn Code Registry" 是 warn-code 值及其含义的权威来源。
任何服务器或缓存都可以(MAY)在响应中生成 Warning 头字段。警告被分配三位数的 warn-code。第一位数字表示该警告是否需要在验证后从存储的响应中删除:
-
1xx warn-code 表示描述响应新鲜度或验证状态的警告,因此在成功验证后必须(MUST)删除。如果执行了验证,无论验证是否改变响应的新鲜度生命周期,都不得(MUST NOT)生成 1xx warn-code。
-
2xx warn-code 表示描述表示的某些方面、且这些方面不会由验证修正的警告(例如表示的有损压缩),因此在验证后不得(MUST NOT)删除,除非完整的响应内容发生变化(即,与响应关联的实体标签发生变化),在这种情况下必须(MUST)删除。
当 1xx warn-code 随过期响应发送时,每次缓存发送过期响应都应当(SHOULD)发送它,即使之前已经发送过同一警告。
当发送 2xx warn-code 时,每次缓存发送关联响应都应当(SHOULD)发送它,即使同一警告已经发送过。
如果实现发送的消息带有一个或多个 Warning 头,且其版本为 HTTP/1.0 或更低,则发送方必须(MUST)在每个 warning-value 中包含与响应中 Date 头字段匹配的 warn-date。
如果实现收到的消息包含带 warn-date 的 warning-value,且该 warn-date 与响应中的 Date 值不同,则在存储、转发或使用该消息之前,必须(MUST)从消息中删除该 warning-value。这可以防止朴素缓存 Warning 头字段带来的不良后果。
如果所有 warning-value 都因此被删除,Warning 头字段也必须(MUST)被删除。