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-Typeboundaryという属性が追加され、各ブラウザが独自のフォーマットでランダムに境界文字列を作り出して、その文字列によってデータを分けている

  • 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形式でファイルを送信しようとしてみると、ファイルに必要な情報が全て送信できないために失敗する