はじめに
どうぞお楽しみに nikkieです😭😭😭
最近の小さな発見、セミコロンも含めたContent-Type指定についてです。
目次
きっかけはUnstructured
Content-Typeにセミコロンを含むことを知ったのは、Unstructuredを触っているときです。
https://www.arxiv-vanity.com/papers/2305.14283/ をpartition
関数で読み込むときに、エラーが送出され、content_type="text/html"
と指定して解決しました。
エラーの原因がContent-Typeのセミコロンだったのです1。
HTTPレスポンスのContent-Typeは'text/html; charset=utf-8'
とセミコロンを含んでいました。
MDNのContent-Type(HTTPヘッダー)
HTTP通信のリクエストやレスポンスのヘッダの項目の1つです。
リクエストにおいては (POST または PUT などで)、クライアントがサーバーに実際に送ったデータの種類を伝えます。
レスポンスにおいては、 Content-Type ヘッダーはクライアントに返されたコンテンツの実際の種類を伝えます。
取りうる値の例:
Content-Type: text/html; charset=UTF-8 Content-Type: multipart/form-data; boundary=something
セミコロン含んでる!!
文法的には
Content-Type: <MIMEタイプ>; <charsetまたはboundary>
のようでした。
Content-Typeにはapplication/json
を特に指定してきました2が、これはMIMEタイプだったのですね!
MDNにはよくあるMIMEタイプもまとめられています。
- application/json
- text/html
深掘り Content-Type(RFC 2045)
5で「Content-Type Header Field」を扱います。
5.1にはContent-Typeの指定のBNFがあります。
https://datatracker.ietf.org/doc/html/rfc2045#section-5.1
content := "Content-Type" ":" type "/" subtype *(";" parameter)
リテラルで"Content-Type"
と":"
が続き、typeが来ます。
その後リテラルの"/"
とsubtype。
そして、「リテラル";"
(セミコロン!)とparameter」が0個以上。
typeとsubtypeは/(選言 ALTERNATIVES)を使って定義されています。
type := discrete-type / composite-type
typeはdiscrete-typeまたはcomposite-typeということです(以降はRFCに譲り省略します)。
parameterはattribute "=" value
という形式ですね。
例として、Content-Type: text/html; charset=UTF-8
を読み解いてみます。
同内容はMDNにもありました(日本語で読めて感謝)。
例えば、 MIME タイプのうちメインタイプが text であるものでは、任意で charset 引数を使用して、データ内の文字の文字コードを指定することができます。
このドキュメントはとても分かりやすそうな印象です。
「MIME タイプは IETF の RFC 6838 で定義され」とあるので、RFC 2045の参照は古かったかもしれません😅
終わりに
HTTPのContent-Typeヘッダー、application/json
とだけ指定することが多かったので、セミコロンも含めてparameterを指定できるのは発見でした。
構成要素に0個以上のセミコロン(とparameter)も定義されています!
content := "Content-Type" ":" type "/" subtype *(";" parameter)
一次情報のRFCを「どんな難しい内容だろう」とビクビクしながら覗きに行きましたが、BNFがあるだけで今回の範囲に関しては読めたぞ!とホクホクしています
予告:これをどうパースするのか、気になってきますよね
P.S. 冒頭の涙😭の訳は
エミリーちゃん!
埋め込んでおいたらいつでも見られますからね
最後ブルーレイはカタカナだけどお仕事だから言うんだね、偉いな〜