nikkie-ftnextの日記

イベントレポートや読書メモを発信

HTTPヘッダーのContent-Typeには、セミコロンを含められるのか!

はじめに

どうぞお楽しみに 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)

調べていく中でRFC 2045が見つかりました3

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を読み解いてみます。

  • typeはtext
  • subtypeがhtml
  • ";" parameterが1個ある

同内容はMDNにもありました(日本語で読めて感謝)。

例えば、 MIME タイプのうちメインタイプが text であるものでは、任意で charset 引数を使用して、データ内の文字の文字コードを指定することができます。

このドキュメントはとても分かりやすそうな印象です。
MIME タイプは IETFRFC 6838 で定義され」とあるので、RFC 2045の参照は古かったかもしれません😅

終わりに

HTTPのContent-Typeヘッダー、application/jsonとだけ指定することが多かったので、セミコロンも含めてparameterを指定できるのは発見でした。
構成要素に0個以上のセミコロン(とparameter)も定義されています!

content := "Content-Type" ":" type "/" subtype *(";" parameter)

一次情報のRFCを「どんな難しい内容だろう」とビクビクしながら覗きに行きましたが、BNFがあるだけで今回の範囲に関しては読めたぞ!とホクホクしています

予告:これをどうパースするのか、気になってきますよね

P.S. 冒頭の涙😭の訳は

エミリーちゃん!

埋め込んでおいたらいつでも見られますからね

最後ブルーレイはカタカナだけどお仕事だから言うんだね、偉いな〜


  1. Issue書きました。
  2. 親の顔を見るより
  3. リンク先の右カラムにありますが、後続のRFCでupdateされています。obsoleted(時代遅れになった)はないからまだ有効だと思っています(このRFCを知った経緯はまたの機会に)