6月 132019
 
Pocket

概要

参照 RFC7230 4, 3.3.1

  • HTTP メッセージボディーの転送は、HTTP/1.0 までは Content-Length で指定した長さのデータを転送する方式しかなかった
    • 転送が終わるまでボディーデータの全てをメモリ上にとどめておく必要があるなどした
  • HTTP/1.1 にて chunked transfer coding (chunked) ができるようになり、ボディーデータを分割して転送することができるようになった
    • 事前に最終的な長さが分からなくても転送可能
  • HTTP/2 には Transfer Codings の仕組み自体がない
    • Stream に取って代わられたため

  • Transfer Codings の方式は、TE および Transfer-Encoding ヘッダーにて指定する
    • TE ヘッダーでクライアントが受入可能な方式を指定
    • Transfer-Encoding ヘッダーで送信するメッセージの符号化方式を指定
  • 受信者は chunked を復号化できなければならない [RFC7230 4.1]
  • Transfer-Encoding は hop-by-hop ヘッダーであり、隣接ノード間にのみ適用される [RFC7230 3.3.1]
    • 故に、プロキシなどの中継者は Transfer-Encoding を復号化し、Content-Length 方式や別の Transfer-Encoding に変換するなどしても良い
    • Content-Encoding ヘッダーは end-to-end ヘッダーである点に注意

chunked transfer coding

参照 RFC7230 4.1

以下のような形式で分割送信される。

HTTP/1.1 200 OK
Date: Thu, 20 Sep 2018 01:59:09 GMT
Transfer-Encoding: chunked

c
example data
4
hoge
0
Expires: Wed, 21 Oct 2015 07:28:00 GMT

  1. チャンクサイズ(16進数文字列) + CRLF を送信
  2. チャンクデータ + CRLF を送信
  3. それ以上データがなければ 0 + CRLF を送信
  4. Trailer ヘッダーがあれば送信
  5. CRLF で終端

TE, Trailer

参照 RFC7230 4.3, 4.4

  • 上記の通り、ボディーデータの後にトレイラーヘッダーが付加されることがある
  • 受信者がトレイラーヘッダーを許容するつもりがある場合、TE ヘッダーに trailers を指定する[RFC7230 4.3]
  • chunked 方式は必須実装であるため、TE ヘッダーはそれ以外の方式を指定する場合に用いられる
  • トレイラーヘッダーの受信者は、それらが HTTP メッセージのヘッダーに付加されていたかのように処理して良い [RFC7230 4.1.2]
    • 一部のヘッダーは禁止されており、無視しなければならない
  • HTTP/2 にもトレイラーヘッダーの概念は存在する

Compression Codings

参照 RFC7230 4.2

  • chunked 以外にも圧縮を用いる Transfer Codings を指定できる
    • cmopress, deflate, gzip
  • 利用する場合、クライアントは TE ヘッダーにて利用できることを示さなければならない
  • Transfer-Encoding で指定された順序で Encoding されている [RFC7230 3.3.1]
    • Transfer-Encoding: gzip, chunked なら、gzip 圧縮された上で chunked されている事を示す
    • chunked を複数回適用することはできない

HTTP メッセージボディーの長さ

参照 RFC7230 3.3.3, 3.4

  • かなり細かいので詳細は RFC 参照
  • Transfer-Encoding がある場合はそれを使用して判断する
    • Transfer-Encoding があり、chunked ではないレスポンスの場合は Close により終端が決定される
    • Transfer-Encoding があり、chunked ではないリクエストの場合は 400 Bad Request として処理しなければならない
  • Transfer-Encoding がない場合は Content-Length を使用する

 Leave a Reply