[410] [DFN[[CODE(HTTP)@en[[[Accept-Encoding:]]]]]] [[ヘッダー]]は、
[[利用者エージェント]]が受け入れ可能な[[内容符号化]]を[[鯖]]に対して示すものです。

* 仕様書

[REFS[
- [409] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-5.3.4>'''
- [6] [CITE@en[RFC 7694 - Hypertext Transfer Protocol (HTTP) Client-Initiated Content-Encoding]] ([TIME[2015-11-04 14:05:14 +09:00]] 版) <https://tools.ietf.org/html/rfc7694>
]REFS]

* 意味

[411] [[要求]]の [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]は、
[[応答]]においてどの[[内容符号化]]が受け入れ可能かを[[利用者エージェント]]が示すものです
[SRC[>>409]]。

[418] [CODE(HTTP)@en[[[Accept-Encoding:]]]] なしの[[要求]]は、
[[利用者エージェント]]が[[内容符号化]]について特に好みが無いことを表します [SRC[>>409]]。

[10] [[応答]]の [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]は、
対応する[[要求]]において[[資源]]が受け入れる意思があった[[内容符号化]]を示すものです
[SRC[>>6]]。

;; [11] 同じ[[サーバー]]の他の[[資源]]が同じ[[内容符号化]]を受け入れるとは限りませんし、
同じ[[資源]]でも条件や時間の変化で受け入れ可能な[[内容符号化]]が変わるかもしれません
[SRC[>>6]]。

* 構文

[413] [[欄値]]は、0個以上の値の[[リスト]] ([CODE[#]]) です [SRC[>>409]]。

[FIG(railroad)[
= ?
== 符号化と重み
== *
=== [[OWS]]
=== [CODE[[[,]]]]
=== [[OWS]]
=== 符号化と重み
]FIG]

[414] [[リスト]]のそれぞれの値は、符号化の名前か、その後に [CODE(HTTP)@en[[[q]]]]
[[引数]]を指定したものです [SRC[>>409]]。

[415] 符号化の名前は、[[内容符号化]]の名前か、 [CODE(HTTP)@en[[[identity]]]] か、
[CODE(HTTP)[[[*]]]] のいずれかです [SRC[>>409]]。

[FIG(railroad)[
= |
== [[字句]]
== [CODE[[[*]]]]
= ?
== [[OWS]]
== [CODE[[[;]]]]
== [[OWS]]
== |
=== [CODE[[[q]]]]
=== [CODE[[[Q]]]]
== [CODE[[[=]]]]
== [[品質値]]
]FIG]

[424] [[要求]]の [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]がいずれも空なら、
どの[[内容符号化]]も望まないことを示しています [SRC[>>409]]。

;; [425] [CODE(HTTP)@en[[[identity]]]] のみ指定した場合と同じになります。

;; [427] ほとんどの [[HTTP/1.0]] [[応用]]は、
[[内容符号化]]の [CODE(HTTP)@en[[[q]]]] 
に対応していません [SRC[>>409]]。

[12] [[応答]]の [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]に
[CODE[[[identity]]]] のみが指定されている場合、
どの[[内容符号化]]を受け入れられないことを示します [SRC[>>6]]。

* 文脈

[412] 複数の[[ヘッダー]]を指定することもできます。

[7] [[要求]]でも[[応答]]でも使うことができます [SRC[>>6]]。

[19] 
[[要求]]は、
[[Web互換性]]のため、
[CODE[Accept-Encoding:]]
ヘッダーに
[CODE[br]],
[CODE[gzip]],
[CODE[deflate]]
の1つ[[以上]]を指定しなければなりません。
[SEE[ [[docs.github.com]] ]]

[57] [[サーバー]]は、[[要求]]の[[内容符号化]]が原因で [CODE(HTTP)@[[[415]]]] [[応答]]を返す場合、
[[応答]]に [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]を含める[RUBYB[べき]@en[ought to]]です
[SRC[>>6]]。

[58] [[サーバー]]は、その他の原因で [CODE(HTTP)[[[415]]]] [[応答]]を返す場合、
[[応答]]に [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]を含めては[['''なりません''']]
[SRC[>>6]]。

* 内容符号化

[432] [[内容符号化]]の名前としては、 [CODE(HTTP)@en[[[gzip]]]] や
[CODE(HTTP)@en[[[deflate]]]] などを指定できます。大文字・小文字は区別しません。
詳しくは[[内容符号化]]の項を参照してください。

* [CODE(HTTP)[*]]

[416] [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]における [DFN[[CODE(HTTP)@en[[[*]]]]]]
は、他に明記されていないすべての利用可能な[[内容符号化]]を表します [SRC[>>409]]。

;; [417] [[内容符号化]]、とされていますが、 [CODE(HTTP)@en[[[identity]]]]
も含まれるようです (>>421)。

* 引数

[433] [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]では、
[CODE(HTTP)@en[[[q]]]] [[引数]] (だけ) を使えます。 詳しくは[[品質値]]を参照してください。

* 処理

[419] [[サーバー]]は、[[応答]]を送信するにあたり、
ある[[表現]]で適用されている[[内容符号化]]が受け入れられるかどうか、
次のようにして決定します [SRC[>>409]]。
[FIG(steps)[
= [420] [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]がなければ、
どの[[内容符号化]]も受け入れられると考えます。
= [421] 当該[[表現]]が[[内容符号化]]無しなら、
[CODE(HTTP)@en[[[identity]];[[q]]=0]] が指定されている場合や 
[CODE(HTTP)@en[[[identity]]]] の指定なしで [CODE(HTTP)@en[*;[[q]]=0]]
が指定されている場合を除き、受け入れられます。
= [422] 当該[[表現]]の[[内容符号化]]が [CODE(HTTP)@en[[[Accept-Encoding:]]]]
に指定されているもののいずれかであるなら、 [CODE(HTTP)[[[q]]=0]]
が指定されている場合を除き、受け入れられます。
]FIG]

[423] 複数の[[内容符号化]]が受け入れられる場合は、
[CODE(HTTP)[[[q]]]] が最高の値のものを優先します [SRC[>>409]]。

;; [428] 同じ[[内容符号化]]が複数回指定されている時、どう解釈するべきかは定義されていません。
[CODE(HTTP)[[[q]]]] が 0 なら受け入れず、それ以外なら値が大きい方とみなすべきでしょうか。

;; [429] 同じ値の [CODE(HTTP)[[[q]]]] の[[内容符号化]]が複数ある時、
どれを選択するべきかは明記されていません。

[426] [[起源鯖]]は、受け入れられる[[内容符号化]]がなければ、
[[内容符号化]]なしの[[応答]]を送る[['''べきです''']] [SRC[>>409]]。

;; [430] [[内容折衝]]の他の観点とは違って、 [CODE(HTTP)[[[406]]]]
を送るとはされていません。しかし、 [CODE(HTTP)[[[406]]]]
を返すことや、 [CODE(HTTP)@en[[[Accept-Encoding:]]]] を無視して受け入れられない[[内容符号化]]で送ることも、
完全には禁止されていません。

;; [431] [CODE[[[.tar.gz]]]] ファイルを送る場合など、
[CODE(HTTP)@en[[[Accept-Encoding:]]]] を無視してそのまま用意されている[[内容符号化]]を使って送るべき場合も少なくなさそうです。

* 歴史

[REFS[
- [407] [CITE[Request Headers in the HTTP protocol]]
( ([TIME[2001-11-29 11:01:38 +09:00]] 版))
<http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#accept-encoding>
]REFS]

[1] 古い時代の [[HTTP]] では (他の欄同様に) [CODE(HTTP)[[[,]]]] と [CODE(HTTP)[[[;]]]] を逆に使ったりすることもありました。

[2] というかそうしていました。

[FIG(quote)[
[FIGCAPTION[
[408] RFC 1945 (HTTP/1.0) D.2.3; RFC 2068・2616 (HTTP/1.1) 14.3 Accept-Encoding
]FIGCAPTION]

> The Accept-Encoding request-header field is similar to Accept, but restricts the [DEL[[INS[{1945,2068}]] content-coding values [INS[[INS[{2068}]] (section 14.12)]] which]] [INS[[INS[{2616}]] content-codings (section 3.5) that]]
are acceptable in the response.

[CODE(HTTP)[Accept-Encoding]] 応答頭欄は、 [CODE(HTTP)[[[Accept]]]]
と同様のものですが、応答で受入れ可能な [[content-coding]] を制限します。

[INS[

> [INS[{2068,2616}]]
- [DEL[[INS[{2068}]] [CODE(ABNF)[[DFN[Accept-Encoding]] = "Accept-Encoding" ":" #( content-coding )]]]]
- [INS[[INS[{2616}]] [CODE(ABNF)[[DFN[Accept-Encoding]] = "Accept-Encoding" ":" 1#( codings [ ";" "q" "=" qvalue ] )]]]]
- [INS[[INS[{2616}]] [CODE(ABNF)[[DFN[codings]] = ( content-coding | "*" )]]]]

> [DEL[[INS[{2068}]] An example of its use is]] [INS[[INS[{2616}]] Examples of its use are:]]
- Accept-Encoding: compress, gzip
- [INS[[INS[{2616}]] Accept-Encoding:]]
- [INS[[INS[{2616}]]  Accept-Encoding: *]]
- [INS[[INS[{2616}]]  Accept-Encoding: compress;q=0.5, gzip;q=1.0]]
- [INS[[INS[{2616}]]  Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0]]

[INS[

> [INS[{2616}]] A server tests whether a content-coding is acceptable, according to
an Accept-Encoding field, using these rules:
= 1. If the content-coding is one of the content-codings listed in
the Accept-Encoding field, then it is acceptable, unless it is
accompanied by a qvalue of 0. (As defined in section 3.9, a
qvalue of 0 means "not acceptable.")
= 2. The special "*" symbol in an Accept-Encoding field matches any
available content-coding not explicitly listed in the header field.
= 3. If multiple content-codings are acceptable, then the acceptable
content-coding with the highest non-zero qvalue is preferred.
= 4. The "identity" content-coding is always acceptable, unless
specifically refused because the Accept-Encoding field includes
"identity;q=0", or because the field includes "*;q=0" and does
not explicitly include the "identity" content-coding. If the
Accept-Encoding field-value is empty, then only the "identity"
encoding is acceptable.

サーバーは、 [CODE(HTTP)[Accept-Encoding]] 欄に従い、次の規則を使って
[CODE(ABNF)[content-coding]] が受け入れ可能かを検査します:
= Content-coding が [CODE(HTTP)[Accept-Encoding]] 欄に列挙された content-coding
なら、その [[qvalue]] が [CODE(HTTP)[0]] でない限りは受入れ可能です。
(3.9 節で定義したように、 qvalue [CODE(HTTP)[0]] は「受入れ不能」を意味します。)
= [CODE(HTTP)[Accept-Encoding]] 欄中の特殊な [CODE(HTTP)[*]] 記号は、
頭欄中に陽に列挙されていない利用可能な content-coding に一致します。
= 複数の content-coding が受入れ可能なら、最高の非零 qvalue の受入れ可能
content-coding を優先します。
= [CODE(HTTP)[[[identity]] content-coding は、 [CODE(HTTP)[Accept-Encoding]] 欄が]]
[CODE(HTTP)[identity;q=0]] を含むか、 [CODE(HTTP)[*;q=0]]
を含んで [CODE(HTTP)[identity]] content-coding を陽に含んでいないために特に断られていない限り、
常に受入れ可能です。 [CODE(HTTP)[Accept-Encoding]] 欄値が空の場合、
[CODE(HTTP)[identity]] 符号化だけが受入れ可能です。

> If an Accept-Encoding field is present in a request, and if the
server cannot send a response which is acceptable according to the
Accept-Encoding header, then the server SHOULD send an error response
with the 406 (Not Acceptable) status code.

[CODE(HTTP)[Accept-Encoding]] 欄が要求に示されている場合、
そしてサーバーが  [CODE(HTTP)[Accept-Encoding]] 頭に従って受入れ可能な応答を送れない場合は、
サーバーは [CODE(HTTP)[[[406]]]] (受入れ不能) 状態符号で誤り応答を送る'''べきです'''。
]INS]

> If no Accept-Encoding field is present in a request, the server MAY
assume that the client will accept any content coding. [INS[[INS[{2616}]] In this case, if "identity" is one of the available content-codings, then the server SHOULD use the "identity" content-coding, unless it has additional information that a different content-coding is meaningful to the client.]] [DEL[[INS[{2068}]] If an Accept-Encoding header is present, and if the server cannot send a response which is acceptable according to the Accept-Encoding header, then the server SHOULD send an error response with the 406 (Not Acceptable) status code.]]

[CODE(HTTP)[Accept-Encoding]] 欄が要求中に示されていない場合、
サーバーはクライアントがどの内容符号かも受け入れると仮定しても'''構いません'''。 [INS[[INS[{2616}]] この場合、 [CODE(HTTP)[identity]] が利用可能な content-coding の1つであれば、クライアントにはこれ以外の content-coding に意味があるという追加の情報がない限り、サーバーは [CODE(HTTP)[identity]] content-coding を使用する'''べきです'''。]] [DEL[[INS[{2068}]] [CODE(HTTP)[Accept-Encoding]] 頭が示されている場合、そしてサーバーが  [CODE(HTTP)[Accept-Encoding]] 頭に従って受入れ可能な応答を送れない場合は、サーバーは [CODE(HTTP)[[[406]]]] (受入れ不能) 状態符号で誤り応答を送る'''べきです'''。]]

[DEL[

> [INS[{2068}]] An empty Accept-Encoding value indicates none are acceptable.

空の [CODE(HTTP)[Accept-Encoding]] 値は、どれも受け入れ可能でないことを示します。
]DEL]

[INS[

> [INS[{2616}]] Note: If the request does not include an Accept-Encoding field,
and if the "identity" content-coding is unavailable, then
content-codings commonly understood by HTTP/1.0 clients (i.e.,
"gzip" and "compress") are preferred; some older clients
improperly display messages sent with other content-codings.  The
server might also make this decision based on information about
the particular user-agent or client.
> Note: Most HTTP/1.0 applications do not recognize or obey qvalues
associated with content-codings. This means that qvalues will not
work and are not permitted with x-gzip or x-compress.

注意 : 要求が [CODE(HTTP)[[[Accept-Encoding]]]] 欄を含んでいない場合、
そして [CODE(HTTP)[identity]] content-coding が利用可能で無い場合、
HTTP/1.0 クライアントが広く理解可能な content-coding 
(すなわち [CODE(HTTP)[[[gzip]]]] 及び [CODE(HTTP)[[[compress]]]])
が優先されます。幾つかの古いクライアントは他の content-coding
で送られたメッセージを不適切に表示します。サーバーは特定の利用者エージェントまたはクライアントについての情報にも基づいてこの決定を行うかもしれません。

注意 : ほとんどの HTTP/1.1 応用は content-coding
に関連付けられた qvalue を認識したり従ったりしません。
これは、 qvalue が [CODE(HTTP)[[[x-gzip]] や [CODE(HTTP)[[[x-compress]]]]]]
では働かず、認められないことを意味します。
]INS]
]INS]
]FIG]

[8] 従来は[[要求]]での用法のみ規定されていましたが、 [DFN[[[RFC 7694]]]]
は[[応答]]でも利用できると拡張しています [SRC[>>6]]。

;; [9] 従来[[応答]]での利用は明示的に禁止されていたわけではありませんが、
[[応答]]に含まれる場合の意味や処理方法が規定されていませんでした。
(品質が低い [[IETF]] の[[仕様書]]を理解するには[[行間を読む]]必要があります。
意味が規定されていないなら、認められていないと解釈するのが一般的なようです。)

* 実装

[3] 今の時代の [[UA]] でも、知らない content-coding
を使ってるとそのまま表示しちゃったりしますよね。。。

[4]
[CODE(HTTP)@en[[[Accept-Encoding]]]] を受信したら[[鯖]]はそれに従うか
[CODE(HTTP)@en[[[406]]]] と[['''するべきです''']]と [[RFC 2616]]
にはありますが、実際の多くの [[Web頁]]ではそうはならないようです。
例えば、 [CODE(HTTP)@en[[[Accept-Encoding]]: [[*]]; [[q]]=0]]
とだけあれば必ず [CODE(HTTP)@en[[[406]]]] が返されるべきですが、
実際にそうなるのは [[Apache]] で[[内容折衝]]が用いられている静的な[[文書]]などに限られます。
([[名無しさん]] [WEAK[2007-11-23 05:49:34 +00:00]])

* 関連

[434] [[要求]]の [CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]で受け入れを示した[[内容符号化]]を実際に[[応答]]で使う場合、
[[応答]]には [CODE(HTTP)@en[[[Content-Encoding:]]]] [[ヘッダー]]を設定することになっています。

[435] [[内容符号化]]と[[転送符号化]]は似ていますが、別のものです。
[CODE(HTTP)@en[[[Accept-Encoding:]]]] [[ヘッダー]]は[[内容符号化]]を示すものですが、
これに相当する[[転送符号化]]を示すものは、 [CODE(HTTP)@en[[[TE:]]]]
[[ヘッダー]]です。

[436] [CITE@en[Network.http.accept-encoding - MozillaZine Knowledge Base]]
( ([TIME[2007-05-09 12:26:13 +09:00]] 版))
<http://kb.mozillazine.org/Network.http.accept-encoding>

[FIG(quote)[
[FIGCAPTION[
[5] [CITE[Welcome to Netscape Navigator Version 2.0]]
([TIME[2015-01-24 23:11:49 +09:00]] 版)
<http://web.archive.org/web/20030202175634/http://wp.netscape.com/eng/mozilla/2.0/relnotes/windows-2.0.html>
]FIGCAPTION]

> Options | General Preferences | Language "Accept Language" enables the user to select a prioritized list of language/region codes that reflect what language a user wishes to display a document in, if that document is available in different language translations. The "accept language" information is contained in the HTTP Header's HTTP_ACCEPT_LANGUAGE. A server that provides different language versions of the same content could thus accommodate a user's preferred language.

]FIG]

[13] [CITE@en[Specify identity encoding for range requests]]
([[jakearchibald]]著, [TIME[2018-06-06 16:26:21 +09:00]])
<https://github.com/whatwg/fetch/commit/2f3d04d3713f6cd0f89d491217175b55911927be>

[14] [CITE@en[Some servers seem to expect 'Accept-Encoding : identity' to serve Range requests · Issue #747 · whatwg/fetch]]
([TIME[2018-06-08 18:52:01 +09:00]])
<https://github.com/whatwg/fetch/issues/747>

[15] [CITE@en[jakearchibald/accept-encoding-range-test]]
([TIME[2018-06-08 18:54:04 +09:00]])
<https://github.com/jakearchibald/accept-encoding-range-test>

[16] [CITE@en[Specify identity encoding for range requests. Fixes #747. by jakearchibald · Pull Request #751 · whatwg/fetch]]
([TIME[2018-06-08 18:55:00 +09:00]])
<https://github.com/whatwg/fetch/pull/751>

[17] [CITE@en[Additional reasoning for sending Accept-Encoding: identity]]
([[jakearchibald]]著, [TIME[2018-06-14 21:52:27 +09:00]])
<https://github.com/whatwg/fetch/commit/f342c749b82ad63563fbb2f1b4e84620efe1d63b>

[18] [CITE@en[Additional reasoning for sending Accept-Encoding: identity by jakearchibald · Pull Request #764 · whatwg/fetch]]
([TIME[2018-06-16 14:29:25 +09:00]])
<https://github.com/whatwg/fetch/pull/764>