6.51. kink/http/MEDIA_TYPE

6.51.1. media_type型

media_typeはデータのメディアタイプである。

media_typeは次のメタデータを表現できる。

• HTTPリクエスト/レスポンスのContent-Typeヘッダフィールドのmedia-type値 [RFC 9110 - 8.3.1]。

• HTTPリクエストのAcceptヘッダフィールドのmedia-range値。 q パラメータを含む [RFC 9110 - 12.5.1]。

• マルチパート実体のパートの、Content-Typeヘッダフィールドの値 [RFC 2046 - 5.1]。

6.51.1.1. Mt.type

typeメソッドは、メディアタイプのtype部分をstrとして戻す。

結果のstr値は、[RFC 9110 - 5.6.2]で定義された「token」になる。

6.51.1.2. Mt.subtype

subtypeメソッドは、メディアタイプのsubtype部分をstrとして戻す。

結果のstr値は、[RFC 9110 - 5.6.2]で定義された「token」になる。

6.51.1.3. Mt.params

paramsは、パラメータ名から対応するパラメータ値へのmapを戻す。

mapのキーは、[RFC 9110 - 5.6.6]で定義されているとおり、大文字、小文字を区別しない。

6.51.1.4. Mt.charset

charsetメソッドは、メディアタイプのcharsetを戻す。

Mtが「charset」パラメータを持っていて、その値がcharset名として有効な場合、charsetメソッドは、その名前に相当するcharset値を戻す。

Mtが「charset」パラメータを持っていないか、その値がcharset名として無効な場合、charsetメソッドは、UTF-8を戻す。

デフォルトのcharset

UTF-8にフォールバックするのは標準化された方法ではない。これが適当でない場合は、カスタムコードを書こう。

• [RFC 2046 - 4.1.2] (MIME part 2)は、デフォルトcharsetをUS-ASCIIと規定している。US-ASCIIはUTF-8のサブセットである。

• [RFC 9110 - 8.3.2] (HTTP意味論)は、デフォルトcharsetを規定していない。

• [RFC 7231 - Appendix B] (廃止; HTTP 1.1)は、デフォルトcharsetは「メディアタイプの定義が指定するもの」だとしている。

6.51.1.5. Mt1 == Mt2

== 演算子、つまりop_eqメソッドは、Mt1とMt2が同等のtype, subtype, パラメータを持っているかどうかを戻す。

事前条件

Mt2はmedia_typeでなければならない。

6.51.1.6. Mt.show(...[$config={}])

showは、ヘッダフィールドに埋め込める、メディアタイプのstr表現を戻す。

$configは無視される。結果の形式が固定であるため。

.showメソッドの一般的な契約については、kink/STRの*.show(...[$config])を見よう。

メディアタイプのパラメータ

パラメータ名は、 `charset`, `q` のように、小文字で出力される。

メディアタイプがパラメータ q を持っている場合、 q は常に最後に現れる。これは、[RFC 9110 - 12.5]の Accept/Accept-* ヘッダに対応するためである。

パラメータ値は、バックスラッシュ `\` か、二重引用符 `"` を含む場合にのみ引用符でくくられる。

:MEDIA_TYPE.require_from('kink/http/')

:Mt1 <- MEDIA_TYPE.new('application' 'octet-stream').show
stdout.print_line(Mt1.show)
# => application/octet-stream

:Mt2 <- MEDIA_TYPE.new('text' 'plain'){(:C)
  C.param('CHARSET' 'UTF-8')
  C.param('x_newline' 'crlf')
  C.param('q' '0.4')
}
stdout.print_line(Mt2.show)
# => text/plain; charset=UTF-8; x_newline=crlf; q=0.4

:Mt3 <- MEDIA_TYPE.new('multipart' 'form-data'){(:C)
  C.param('boundary' 'abcd--\--wxyz')
}
stdout.print_line(Mt3.show)
# => multipart/form-data; boundary="abcd--\\--wxyz"

6.51.2. MEDIA_TYPE.new(Type Subtype ...[$config={}])

newは新しいmedia_typeを戻す。

コンフィグメソッド:

• C.param(Name Val): 複数回呼び出せる。

Typeはメディアタイプのtype部分に、Subtypeはsubtype部分になる。

NameとValは、それぞれのパラメータの名前と値になる。

事前条件

Typeは、[RFC 9110 - 5.6.2]で定義された「token」のstr値でなければならない。

Subtypeは、[RFC 9110 - 5.6.2]で定義された「token」のstr値でなければならない。

Nameは、[RFC 9110 - 5.6.2]で定義された「token」のstr値でなければならない。

Valは、コードポイントU+0009, またU+0020-U+00ffからなるstrでなければならない。これは、[RFC 9110 - 5.6.4]の「quoted-string」が、ISO-8859-1文字コードでデコードされたものと想定している。

6.51.3. MEDIA_TYPE.parse(Str ...[$config={}])

parseは、[RFC 9110 - 8.3.1]で定義される「media-type」の文法にしたがって、Strからmedia_typeをパースする。

コンフィグメソッド:

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

Strが成功裏にパースできる場合、parseは、media_typeを引数として$successを末尾呼び出しする。

Strがパースできない場合、parseは引数なしで$errorを末尾呼び出しする。

「obs-text」の扱い

コードポイントU+0080-U+00ffは、二重引用符でくくられていれば、パラメータの値として許容される。これは、[RFC 9110 - 5.5]の「obs-text」が、ISO-8859-1文字コードでデコードされたものと仮定している。

事前条件

Strはstr値でなければならない。

$successはmedia_typeを引数に取る関数でなければならない。

$errorはサンクでなければならない。

:MEDIA_TYPE.require_from('kink/http/')

:Mt <- MEDIA_TYPE.parse('text/html; charset=UTF-8')
stdout.print_line(Mt.repr)
# => (media_type type="text" subtype="html" params=(flat_map "charset"=>"UTF-8"))

6.51.4. MEDIA_TYPE.is?(Val)

is?は、Valがmedia_typeであるかどうかを戻す。