Real World HTTPの2章2.1〜2.2を読んだ
2章 HTTP/1.0のセマンティクス:ブラウザの基本機能の裏側
- シンタックス 文法
- セマンティクス 意味の解釈
HTTPの基本の4要素を再確認 - メソッドとパス - ヘッダー - ボディ - ステータスコード
この章では、ブラウザが基本の要素をどのように応用して基本機能を実現させているかを見ていく(特にヘッダーという仕組みの中で多くの機能が実現されている)
フォームを使ったファイルの送信
通常のHTTPのレスポンスは一度に1ファイルずつ返すため、空行を見つけてそこからContent-Lengthで指定されたバイト数分読むだけでデータを丸ごと取得できる。そのため、データの区切りを意識する必要はない
マルチパートフォーム形式(
Content-Type: multipart/form-data;
)を使うとファイルを送信できるようになるが、1度のリクエストで複数のデータを送信できるため、受け取り側でデータを区切らなければならないデータを区切るために、
Content-Type
にboundary
という属性が追加され、各ブラウザが独自のフォーマットでランダムに境界文字列を作り出して、その文字列によってデータを分けているx-www-form-urlencoded
形式だと名前に対してそのコンテンツという1:1の情報しか持てないmultipart/form-data
形式だと、項目ごとに追加のメタ情報をタグとして持てる
multipart/form-data
形式でファイルを送信
POST / HTTP/1.0 Host: localhost:18888 Connection: close Accept: */* Content-Length: 455 Content-Type: multipart/form-data; boundary=------------------------92b2d7a7d10454d4 User-Agent: curl/7.54.0 --------------------------92b2d7a7d10454d4 Content-Disposition: form-data; name="title" The art of Community --------------------------92b2d7a7d10454d4 Content-Disposition: form-data; name="author" Jono Bacon --------------------------92b2d7a7d10454d4 Content-Disposition: form-data; name="attachment-file"; filename="test.txt" Content-Type: text/plain this is a test file. yeaaaah. --------------------------92b2d7a7d10454d4--
x-www-form-urlencoded
形式でファイルを送信しようとしてみると、ファイルに必要な情報が全て送信できないために失敗する