web-dev-qa-db-ja.com

HTTPマルチパートの「Content-length」ヘッダー値はどのように計算されますか?

「マルチパートHTTPリクエストのコンテンツの長さはどのように計算されるのですか?」という質問に対する矛盾した、ややあいまいな返信を読みました。具体的には次のとおりです。

  • 「Content-length」ヘッダーが計算される正確なコンテンツ範囲はどのくらいですか?
  • CRLF( "\ r\n")オクテットシーケンスは1オクテットまたは2オクテットとしてカウントされますか?

誰かがこれらの質問に答える明確な例を提供できますか?

15
Moshe Rubin

次のライブの例は、うまくいけば質問に答えるはずです。

GoogleのOAuth 2.0 Playgroundでマルチパートリクエストを実行する

GoogleのOAuth 2.0 Playground Webページは、Googleドライブクラウドに対してマルチパートHTTPリクエストを実行するための優れた方法です。これを行うためにGoogleドライブについて何も理解する必要はありません-私は私たちはHTTPリクエストとレスポンスにのみ関心がありますが、Playgroundを使用すると、必要に応じてマルチパートを試して他の質問に答えることができます。

アップロード用のテストファイルを作成する

「test-multipart.txt」というローカルテキストファイルを作成し、ファイルシステムのどこかに保存しました。ファイルのサイズは34バイトで、次のようになります。

We're testing multipart uploading!

GoogleのOAuth 2.0 Playgroundを開きます

まず、GoogleのOAuth 2.0 Playgroundをブラウザで開き、URLを使用します https://developers.google.com/oauthplayground/

Google OAuth 2.0 Playground opening screen

ステップ1に記入

Drive API v2と " https://www.googleapis.com/auth/drive "を選択して、[Authorize APIs]を押します。

Fields filled in for Step 1

ステップ2に記入

「トークンのExchange認証コード」をクリックします。

Fields filled in for Step 2

手順3に記入

ここでは、関連するすべてのマルチパートリクエスト情報を提供します。

  • HTTPメソッドを「POST」に設定します
  • ヘッダーを追加する必要はありません。GoogleのPlaygroundが必要なものすべてを追加します(例:ヘッダー、境界シーケンス、コンテンツの長さ)
  • リクエストURI: " https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart "
  • リクエストの本文を入力します。これは、Googleドライブがマルチパートアップロードを実行するために必要なメタデータJSONです。私は以下を使用しました:
 {"title": "test-multipart.txt"、 "parents":[{"id": "0B09i2ZH5SsTHTjNtSS9QYUZqdTA"}]、 "properties":[{"kind": "drive#property"、 "キー": "クラウドラッパー"、 "値": "true"}]} 
  • [Request Body]画面の下部で、アップロードするtest-multipart.txtファイルを選択します。
  • 「リクエストを送信」ボタンを押してください

enter image description here

リクエストとレスポンス

GoogleのOAuth 2.0 Playgroundは、必要なすべてのヘッダーを奇跡的に挿入し、コンテンツの長さを計算し、境界シーケンスを生成し、必要に応じて境界文字列を挿入し、サーバーの応答を示します。 enter image description here

分析

マルチパートHTTPリクエストは200ステータスコードで成功したため、リクエストとレスポンスは信頼できるものです。 GoogleのPlaygroundは、マルチパートHTTPアップロードを実行するために必要なすべてを挿入しました。 「Content-length」が352に設定されていることがわかります。ヘッダーに続く空白行の後の各行を見てみましょう。

-=============== 0688100289 ==\r\n 
コンテンツタイプ:application/json\r\n 
\r\n 
 {"title": "test-multipart.txt"、 "parents":[{"id": "0B09i2ZH5SsTHTjNtSS9QYUZqdTA"}]、 "properties":[{"kind": "ドライブ#property "、" key ":" cloudwrapper "、" value ":" true "}]}\r\n 
-=============== 0688100289 = =\r\n 
コンテンツタイプ:text/plain\r\n 
\r\n 
マルチパートアップロードをテストしています!\ r\n 
-=============== 0688100289 ==-

9行ありますが、最初の8行のそれぞれの終わりに「\ r\n」を手動で追加しました(読みやすさの理由から)。各行のオクテット(文字)の数は次のとおりです。

  1. 29 + '\ r\n'
  2. 30 + '\ r\n'
  3. '\ r\n'
  4. 167 + '\ r\n'
  5. 29 + '\ r\n'
  6. 24 + '\ r\n'
  7. '\ r\n'
  8. 34 + '\ r\n'( '\ r\n'はテキストファイルの一部ではありませんが、Googleが挿入します)
  9. 31

オクテットの合計は344であり、各 '\ r\n'を単一の1オクテットシーケンスと見なすと、切望されたコンテンツの長さは344 + 8 = 352になります。

概要

調査結果を要約するには:

  1. マルチパートリクエストの「Content-length」は、ヘッダーセクションの空白行に続く境界シーケンスの最初のバイトから計算され、最後の境界シーケンスの最後のハイフンまで続きます。
  2. 「\ r\n」シーケンスは、実行しているオペレーティングシステムに関係なく、2オクテットではなく1オクテットとしてカウントする必要があります。
9
Moshe Rubin

Content-Lengthの計算方法は、ペイロードのステータスコードやメディアタイプには依存しません。回線上のバイト数です。したがって、マルチパート応答を作成し、バイトをカウントして(そしてCRLFは2としてカウントされます)、Content-Lengthにそれを使用します。

参照: http://httpwg.org/specs/rfc7230.html#message.body.length

8
Mark Nottingham

HttpメッセージにContent-Lengthヘッダーの場合、このヘッダーはHTTPヘッダーの後に続く正確なバイト数を示します。何でも自由に数えることにした場合\r\n 1バイトにすると、すべてがバラバラになります。キープアライブhttp接続は機能しなくなります。HTTPスタックは次のHTTPメッセージの開始位置を確認できず、ランダムデータをHTTPメッセージであるかのように解析しようとするためです。 。

2
Pavel P