19

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

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

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

4

4 に答える 4

8

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

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

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

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

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

We're testing multipart uploading!

Google の OAuth 2.0 Playground を開く

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

Google OAuth 2.0 Playground の開始画面

ステップ 1 に記入

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

ステップ 1 で入力するフィールド

ステップ 2 に入力

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

ステップ 2 で入力するフィールド

ステップ 3 に記入

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

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

ここに画像の説明を入力

リクエストとレスポンス

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

分析

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

--===============0688100289==\r\n
コンテンツ タイプ: application/json\r\n
\r\n
{"タイトル": "test-multipart.txt", "親": [{"id":"0B09i2ZH5SsTHTjNtSS9QYUZqdTA"}], "プロパティ": [{"種類": "ドライブ#プロパティ", "キー": " 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 オクテットとしてカウントする必要があります。
于 2015-07-14T12:02:06.833 に答える