[2] [CODE(URI)@en[[[ni:]]]] [[URL]] の
[DFN[[CODE(URI)@en[[[ct]]]]]] [[引数]]は、
その [[URL]] で[[識別]]される[[資源]]の[[MIME型]]を表します。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 6920 - Naming Things with Hashes]] ([TIME[2014-06-02 05:17:24 +09:00]] 版) <http://tools.ietf.org/html/rfc6920#section-3.1>
]REFS]

* 意味

[3] [CODE(URI)@en[[[ct]]]] [[引数]]は、関連付けられているデータの
[[MIME型]]を指定するものです [SRC[>>1]]。認証されている情報源から外部の情報源への安全な参照のために[[ダイジェスト]]を使う場合、
その[[ダイジェスト]]の意味は[[MIME型]]など関連付けられている[[メタデータ]]の[[関数]]となることがあるため、
[CODE(URI)@en[[[ni:]]]] [[URL]] には[[MIME型]]を指定できます [SRC[>>1]]。

* 構文

[13] [[MIME型]]の定義として [[RFC 6838]] が参照されています [SRC[>>1]]
が、これが構文の定義として参照しているのかは不明瞭です。[[比較]]については
[[RFC 2045]] を参照していて (>>11)、両者の構文の定義は厳密には一致していません。

* 処理モデル

[4] [[実装]]は、 [CODE(URI)@en[[[ct]]]] [[引数]]の構文解析に対応しなければ[['''なりません''']]
[SRC[>>1]]。

[10] [[利用者エージェント]]が[[MIME型]] [[sensitive]] であり、
[CODE(URI)@en[[[ni:]]]] [[URL]] に [CODE(URI)@en[[[ct]]]]
[[引数]]が指定されており、
[[MIME型]]を指定する[[プロトコル]]によって[[オブジェクト]]を取得した場合には、
両者の[[MIME型]]が一致するなら、問題ありません。
一致しない場合には、セキュリティーエラーの疑いがあるものとして扱う[['''べきです''']]。
[SRC[>>1]]

[11] [[MIME型]]の[[一致]]の判定は、 [[RFC 2045]] 5.1節によります [SRC[>>1]]。

;; [12] この [[RFC 2045]] の5.1節の参照が十分ではない気がします。
[[RFC 2045]] は比較方法を明確には定めていません。大文字と小文字を区別しないことや、
[[引数値]]の[[引用符]]が値の一部ではないことは明記されていますが、
比較において[[引数]]の有無が影響するのかや、
[[引数]]固有の値の正規化が影響するのか (例えば [CODE(MIME)@en[[[charset]]]]
[[引数]]では大文字と小文字を区別しないなど。)、
[[引数]]の順序や空白の違いなどが影響するのかといった詳細は、
規定されていません。

[6] [CODE(URI)@en[[[ni:]]]] [[URL]] を使う[[プロトコル]]は、
その処理の対象となる [[MIME型]]について名前とデータの[[整合性]]をどう検証するかを規定する必要があります。また、
[[CTE]] その他 [[MIME]] の性質を考慮する必要もあるでしょう。 [SRC[>>1]]

[7] [[実装]]は、最低でも [CODE(MIME)@en[[[application/octet-stream]]]]
と [[CTE]] 明記なし ([CODE(MIME)@en[[[binary]]]] と同じ) の場合について名前とデータの[[整合性]]の検証に対応する[['''べきです''']] [SRC[>>1]]。

;; [14] このあたりの規定の意味するところはいまいちよくわかりません。
[[RFC]] では明確な処理モデルが定義されていません。
[[MIME型]]や、 [[CTE]] その他の [[MIME]] の性質によって[[ハッシュ値]]の算出方法が変わるということなのでしょうか
(>>3 も参照)。
([CODE(MIME)@en[[[text/*]]]] なら[[改行]]を正規化するとか??)
最低でも [CODE(MIME)@en[[[application/octet-stream]]]] は対応するべきと言っていますが、
その方法は述べていません。[[バイナリデータ]]としてそのまま[[ダイジェストアルゴリズム]]の入力に使うということなのでしょうか。
[[プロトコル]]に規定を委ねているので、構文を定義するだけで、実際の利用方法を定義する気はないのかもしれません (そんなものに意味があるのかわかりませんが...)。

[8] なお、[[ハッシュ]]は [[CTE]] の除去後の生データで計算します [SRC[>>1]]。

;; [9] だとすると >>6 や >>7 の [[CTE]] についての言及は意味がわからないのですが...
すべて [[CTE]] の除去後の話なら、 [[CTE]] によって動作を変えたり、
わざわざ定義したりする必要はないはずです。

* 例

[5] [[RFC]] には次のような例が示されています。

>
[PRE(URI code)[
ni:///sha-256-32;f4OxZQ?'''ct=text/plain'''
]PRE]
