HTTPで部分的アップロードを可能にする Partial Uploadsという提案仕様

2021/11/24 追記、こちらもあわせてどうぞ
HTTP PUTリクエストにContent-Rangeヘッダを付けられるか?(再開可能アップロードについて)

==
HTTPリクエストは一度中断してしまうと、途中から再開することは出来ません。特に大きなファイルをアップロードしている場合は、最初からやり直すことになってしまいます。(ダウンロード自体は、Content-Rangeを指定することで部分的な取得が可能です)

そこで、細かく分割して部分的なアップロードを可能にする「Partial Uploads in HTTP」という仕様が提出されています。

この仕様では、PATCHメソッドとContent-Rangeヘッダを使用して部分的なアップロードを行います。また、部分的なアップロードに対するレスポンスコード2xx Sparse Resource(具体的な番号はTBD)を新しく定義しています。

部分的なアップロードは、Content-Typeにmessage/byterangeを指定し、PATCHメソッドでデータを送信します。message/byterangeはmultipart/byterangesのような構造を持ちますが単一のRange領域からなります(Content-Rangeは必須)。

部分アップロードの最初の1リクエストは以下のようになります。この例では600バイト中200バイトをアップロードしています。

   PATCH /uploads/foo HTTP/1.1
   Content-Type: message/byterange
   Content-Length: 281
   If-None-Match: *

   Content-Range: bytes 0-199/600
   Content-Type: text/plain
   Content-Length: 200

   [200 bytes...]


つづけて、次の200バイトをアップロードする場合は、以下のようになります。最初同様message/byterangeを指定します。

   PATCH /uploads/foo HTTP/1.1
   Content-Type: message/byterange
   Content-Length: 283
   If-None-Match: *

   Content-Range: bytes 200-399/600
   Content-Type: text/plain
   Content-Length: 200

   [200 bytes...]

部分アップロードを行うリクエストに対するレスポンスのステータスコードは2xx Sparse Resourceを使用します。このSparse Resourceレスポンスは、データ全体を受信したわけではないが該当の部分アップロードリクエストはエラーではないことを示します。

すべてのデータ全体がアップロードされた際のステータスコードは200 OKを返します。