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であるかどうかを戻す。