HTTPのメソッドとボディの関係性
メモ
HTTP/1.1のボディはメソッドによってどういう制限があるのか分からなくなったので調べたkeroxp.icon2020/2/17 一般的にはGET,HEADはボディなし、それ以外はボディありと言われている
だがGETにボディを送ったらどうなるのか? POSTでボディを送らなかったらどうなるのか?
これはぶっちゃけサーバーの実装によるとしかいえないようだ
そこでクライアント側の代表であるfetchの仕様を調べてみたのが以下
table:Chromeのfetchの仕様
content-length chunked なし content-length: 0
GET x x o o(消される)
HEAD x x o o(消される)
OPTION o o o o
DELETE o o o o
POST o o o (content-length:0が付与される) o
分かったこと
GET, HEADはボディを設定するとクライアント側でエラーになる(送れない)
GET,HEADのヘッダにcontent-length: 0を付与しても送る前に消される
transfer-encoding:chunkedも同様
OPTION, DELETEは普通にボディを送れる。POSTと違いが見当たらない
POST系でcontent-length: 0は有効な記述
transfer-encoding:chunkedでも0\r\n\r\nは有効なボディの模様。これは当たり前か。
POST系でボディを引数に渡さないと、クライアント側でcontent-length:0が付与される
つまりcontent-lengthとtransfer-encodingなしのPOSTリクエストは送れない
ここが一番知りたかったのだが、サーバーはこのようなリクエストをどう処理すべきかという点
POSTなのにボディについての情報がない場合は、
content-length:0として処理を続行する
エラーリクエストとして拒否する
このどちらにすべきか。個人的には後者でいいと思うのだが、ロバストにするなら前者になる。
しかしRFC的にはボディを送るならcontent-lengthかchunkedを設定しなければならないと記述されているだけで、「長さ0のボディを送る」ことと「ボディを送らない」ことを明確に区別するべき記述は見つからなかった
なのでPOSTもボディを送らない、GETと同様の振る舞いがプロトコル的に可能なのではないかと思われる
今度はサーバー側の振る舞いを調査してみようと思う