[4] 内容符号化は、 表現に対して適用されている、あるいは適用することができる符号化変形です。 内容符号化は、圧縮などの変形に使うものです。 >>434
[435] 内容符号化の値は、字句で、大文字・小文字不区別です >>434。
[417] 内容符号化を表す値については、 >>3 をご覧ください。
[440] 符号化についての追加の引数は、 Content-Encoding:
とは別のヘッダーによって指定できます >>439。
[438] 内容符号化の値は、 HTTP の Content-Encoding:
ヘッダーや、 Accept-Encoding:
ヘッダー、
encoding
異体属性、
supportedContentEncodings
で用います。
[442] メッセージ本体の転送符号化を復号したものが、
内容符号化が(あれば)適用されているデータです。そこから
Content-Encoding:
の指定の逆により内容符号化を復号することで、
元々のデータが得られます。このデータが、 Content-Type:
によって指定されたデータとなります。
[443] 例えば、
Content-Type: text/html; charset=utf-8 Content-Encoding: gzip, deflate Transfer-Encoding: deflate, chunked... とヘッダーに指定されている場合、メッセージ本体の
chunked
を復号し、 deflate
を復号し、
再度 deflate
を復号し、
gzip
を復号し、 gzip
を復号すると、 utf-8
で符号化された
HTML文書が得られます。[444] 転送符号化とは違って内容符号化は表現自体の特徴とされており、 他のメタデータも原則として内容符号化された状態に適用されるものです。 普通は内容符号化はレンダリングその他の利用の直前に復号されます。 >>439
[446] データが常に圧縮される場合など、 MIME型自体に符号化が含まれている場合には、 これは内容符号化としては扱いません。 >>439
[447] 符号化が Content-Type:
に含まれるか
Content-Encoding:
で指定されるかによって動作が変わる
(ダウンロードになったり、自動で展開されてレンダリングされたりする)
利用者エージェントがあることから、起源鯖がその点のみ異なる同じデータの表現を提供することもあり得ます
>>439。
[76] 現実問題として、 内容符号化の用法は何種類か異なるものがあります。
[77]
HTML や CSS など一般のファイル転送に使われる場合
(例えば Content-Encoding: gzip
)。
HTTPサーバーが圧縮して
HTTPクライアントが展開する、
透過的な転送符号化に近い利用法。
通常の Webブラウザーでの
Webサイトの表示のとき、
利用者に気づかれることなく転送を高速化するためによく使われています。
[79]
圧縮されたファイルのダウンロードに使われる場合。
例えば .tar.gz
圧縮されたファイルを配布するサーバーで、
Content-Encoding: gzip
となっていることがあります。
HTTPクライアントは展開しないでそのまま保存することが期待されています。
[81]
暗号化されたデータの転送に用いる場合
(例えば Content-Encoding: aes128gcm
)。
HTTP レベルで符号化や復号ができず、
応用依存の知識がなければただのバイト列としか処理できません。
[70] クライアントもサーバーも、要求や応答で内容符号化を用いる義務はありません。 相手方からどんな指示があろうとも、符号化しない元の状態で送信することができます。 どの内容符号化の符号化も、実装しないことができます。
[69] 汎用の HTTPサーバーの実装の多くは、 gzip
の符号化に対応しています。
それ以外にも対応していることもありますが、あまり普及はしていません。
[32] 起源鯖が応答に適用する内容符号化の決定方法については、
Accept-Encoding:
を参照してください。
[33] 利用者エージェントは要求に通常は内容符号化を適用しませんが、
仕様上要求に内容符号化を適用して Content-Encoding:
を指定することが禁止されているわけではありません。
[64] 通常の要求では内容符号化を使わないため、 サーバーは内容符号化の復号に対応する必要はありません。
[448] 起源サーバーは、要求が受け付けられない内容符号化による表現を含んでいる場合に、
415
で応答して構いません >>439。
サーバーが要求の内容符号化が原因で処理に失敗した時は、
415
応答を返すべきです >>56。
[65] 応答では gzip
内容符号化が使われる場合がよくあります。
Accept-Encoding:
に指定しない限り符号化しない実装が一般的ですので、
クライアントは必ずしも復号に対応しなくても良いかもしれませんが、
それが真にWeb互換であるかどうかは不明瞭です。クライアントは gzip
の復号に対応するべきです。
[66] 応答では deflate
内容符号化が使われることがあります。
復号に対応しないとWeb互換でないといえるほど広く使われているかどうかは疑問ですが、
一般的なクライアントは対応しているので、クライアントは deflate
の復号にも対応するのが良さそうです。
[68] クライアントは br
に対応している場合があります。
現時点では対応しなくてもWeb互換性は損なわれないと考えられています。
[67] クライアントは compress
を含めその他の内容符号化に対応する必要はありません。
[449] Webブラウザーは、 gzip
や deflate
が内容符号化として用いられている場合、これを復号してからレンダリングします。
[49] Webブラウザーは compress
には対応していないようです。
[50] Webブラウザーは未対応の Content-Encoding:
が指定された時、このヘッダーを無視するようです。
[450] ダウンロードの際は、内容符号化を復号しないで保存するのが望ましいと考えられています。
かつてWebブラウザーは内容符号化を復号してから保存していたので、
しばしば tar+gz で配布されているファイルに Content-Encoding:
が指定されており、勝手に展開される上にファイル名に .gz
が含まれたままになるような不都合が起きていました。
[38] クライアントが恒等でない内容符号化が適用された差分を受信した時は、
[42] 串やキャッシュが基底実現値に差分を適用した結果を転送したり、
キャッシュ項目を使って後から転送したりするなら、
その Content-Encoding:
の値は差分の応答
Content-Encoding:
と同じとし、
適用される内容符号化も同じ状態としなければなりません >>35。
[57] サーバーは、要求の内容符号化が原因で 415
応答を返す場合、
応答に Accept-Encoding:
ヘッダーを含めるべきです
>>56。
[58] サーバーは、その他の原因で 415
応答を返す場合、
応答に Accept-Encoding:
ヘッダーを含めてはなりません
>>56。
[3] 次の値が使われていたり、提案されたりしています。
[5] 多分変てこなロボットだと思うんですが、
なぜか Accept-Encoding
に
text/html
とか text/plain
とか送ってくる奴がいます。数でいうと結構出現頻度が高い。
(同じ奴ばっかだと思うけど。)
[7] Accept-Encoding:
欄に
7bit
, 8bit
,
binary
とか書く UA があるらしい。
なんか勘違いしているような気がする。
[8] x-compress
, x-gzip
は、
HTTP/1.1 が分かる相手には使うべきではありません。
逆に compress
, gzip
は、
HTTP/1.0 しか分からない相手に使うべきではありません。
[6] 今時は HTTP/1.0 の実装でも x-gzip
は知ってるけど gzip
は知らないなんてのは無いみたいです。 Accept-Encoding
も gzip
で送ってくるのがほとんど。 (x-gzip
も送ってくる奴も結構いますが。)
[22] SIP は HTTP と内容符号化の名前を共有しています >>21。
[23] RFC 3261 には「tar
」
という値の例がありますが >>21、定義されていませんし、 IANA
にも登録されていません。
[62] HTTP::Message - search.cpan.org () http://search.cpan.org/~oalders/HTTP-Message-6.13/lib/HTTP/Message.pm
は Content-Encoding:
の値として base64
や
quoted-printable
を実装しています。
base64
については符号化にも対応しています。
[63] HTTP::Message - search.cpan.org () http://search.cpan.org/~oalders/HTTP-Message-6.13/lib/HTTP/Message.pm
は rot13
を符号化して Content-Encoding:
の値に設定することができますが、
復号には対応していません。
[436] 内容符号化の値は、 IANA に登録するべきです >>434。
[12] IANA登録簿 (>>11) は、転送符号化とは別に設けられています。 しかし、同じ符号化の場合を除き、転送符号化と同じ名前を使ってはならない >>1 とされています。
Content-Encoding: gzip
かつ Content-Type: application/x-gzip
で送ってくるサーバーがありますが、ほとんど間違いなく間違いなので(謎)、止めた方がいいですね。/etc/mime.types
が使われて、そのファイルに application/x-gzip .gz
って書いてある、って話だったりします。ちょっと困ったもんです。Content-Encoding: gzip
かつ Content-Type: application/x-gzip
というレスポンスは、
*.tar.gz
などの形式で配布しているアーカイブのためなのでは無いのですか?
(ten 2004-06-02 11:43:03 +00:00)[17]
>>16 そのような応答は、
まず Content-Encoding
を復号して生に戻した状態で application/x-gzip
として解釈するのが正解です。
*.tar.gz
を更にもう一度 gzip
で圧縮しているのであれば >>16 の通りで何ら問題ありませんが、
*.tar.gz
をそのまま送っているのであれば問題です
(application/x-tar
にでもなっていないと)。
(名無しさん 2004-06-03 00:24:16 +00:00)
[45] BREACH 攻撃に注意が必要です。機密性の高い内容を扱う場合は攻撃できないように注意して設計するか、 圧縮を用いるべきではありません。
[47] 機密データと攻撃者が制御できるデータを (同じ圧縮辞書で) 一緒に圧縮してはなりません。データの出所が不明なら、 圧縮してはなりません。 >>46
[48] 実用上は、元から圧縮されているデータの転送や静的ファイルの転送で内容符号化により圧縮することは問題ありませんが、 Webアプリケーションの出力など動的に変化する内容の転送には圧縮を用いるべきではないと考えられます。 動的な内容に適用する時は、それが (境界条件等例外的な場合も含めて) 圧縮しても問題ないことを個別に確認する必要がありますし、 将来の改修によって問題ある状態に変化しないよう相当の注意を払い続ける必要があります。
[416] Content-Encoding:
ヘッダーは名前こそ
Content-
がつきますが、
MIME では規定されておらず、 HTTP 独自のものです。
[2] 内容符号化は MIME の内容転送符号化や HTTP の転送符号化よりも上 (データ側) の層に当たります。 MIME への関門では媒体型の指定に変換することが良いとされています。 (例: HTTP: Content-Encoding: gzip → MIME: Content-Type: application/x-gzip)
[18] HTTP から MIME に変換するときには、
Content-Type:
ヘッダーの値を変更するか、
表現を復号してから転送するかの操作をするべきです
>>15。
application/octet-stream
に conversions
引数があり、
これは Content-Encoding:
と同じ機能 >>15
とされています。ただし MIME のこの機能は削除されています。[26] 透過内容折衝と内容符号化の内容折衝は直交するものです。 透過内容折衝の結果に内容符号化を適用できます。 >>24
[28] 鯖は、透過内容折衝の応答の内容符号化されていない版を提供できるべきです >>24。
[30] Apache の実装では、内容符号化の折衝も透過内容折衝に含めています >>27。
encoding
も参照。[419] 合わせて読みたい: 内容符号化と転送符号化、HTTP//変形
[418] 内容符号化と転送符号化の項もあわせてご覧ください。
[422] 内容符号化は、 HTTP や派生プロトコルで実体に施されている符号化です。
MIME 的には媒体型に含まれてしまいますが、 媒体型を包含する別の媒体型とでも言うべき、独立したものであることが求められます。 例えば圧縮なら、「PNG で使っている圧縮」のような特定の媒体型に依存したものではなく、「gzip」のように圧縮対象に依存しないものでないといけません。
ホップ間の転送のための必要から行う変形は転送符号化というまた別のものになります。 HTTP の転送符号化は MIME の内容転送符号化にほぼ相当しますが、 これもやはり内容符号化とは別のものです。 (名前が似ているので注意。)
[425] 合成型である multipart/*
や message/*
への適用について HTTP
仕様には明記されていません。
[426] SOAP/JMS では >>425 のケースで意味を未定義と明記しています >>424。 規定がないことには違いありません。
[452] RFC 4236 - HTTP Adaptation with Open Pluggable Edge Services (OPES) ( ( 版)) https://tools.ietf.org/html/rfc4236#section-3.2.7
[451] Remove the ability to control content codings. Fixes https://github.com/... · 43f8a7b · whatwg/fetch ( ( 版)) https://github.com/whatwg/fetch/commit/43f8a7b90f07325a58cc31c33129522443c8b843
[453] Web サイトの読み込みエラー | Firefox ヘルプ ( ( 版)) https://support.mozilla.org/ja/kb/websites-dont-load-troubleshoot-and-fix-errors#w_kiagianeoeadaeaeiaau
[52] HTTP compression - Wikipedia, the free encyclopedia ( 版) https://en.wikipedia.org/wiki/HTTP_compression
[60] draft-ietf-httpbis-encryption-encoding-01 - Encrypted Content-Encoding for HTTP ( ()) https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-01
[61] draft-reschke-http-oob-encoding-06 - 'Out-Of-Band' Content Coding for HTTP ( ()) https://tools.ietf.org/html/draft-reschke-http-oob-encoding-06
[71] Content codings contract · Issue #58 · httpwg/http-core () https://github.com/httpwg/http-core/issues/58
[72] Handle failure while handling content codings (annevk著, ) https://github.com/whatwg/fetch/commit/939d5851d6fa592de2de1d0d0e53e76c133a4d9b
[73] Define how to handle bad content encoding · Issue #657 · whatwg/fetch () https://github.com/whatwg/fetch/issues/657
[74] Handle failure while handling content codings by annevk · Pull Request #710 · whatwg/fetch () https://github.com/whatwg/fetch/pull/710
[75] Remove Gecko-only quirk by annevk · Pull Request #816 · whatwg/fetch () https://github.com/whatwg/fetch/pull/816
[82] curl - How To Use (, ) https://curl.haxx.se/docs/manpage.html#--compressed