「マルチパートHTTPリクエストのコンテンツの長さはどのように計算されるのですか?」という質問に対する矛盾した、ややあいまいな返信を読みました。具体的には次のとおりです。
誰かがこれらの質問に答える明確な例を提供できますか?
次のライブの例は、うまくいけば質問に答えるはずです。
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をブラウザで開き、URLを使用します https://developers.google.com/oauthplayground/ :
Drive API v2と " https://www.googleapis.com/auth/drive "を選択して、[Authorize APIs]を押します。
「トークンのExchange認証コード」をクリックします。
ここでは、関連するすべてのマルチパートリクエスト情報を提供します。
{"title": "test-multipart.txt"、 "parents":[{"id": "0B09i2ZH5SsTHTjNtSS9QYUZqdTA"}]、 "properties":[{"kind": "drive#property"、 "キー": "クラウドラッパー"、 "値": "true"}]}
GoogleのOAuth 2.0 Playgroundは、必要なすべてのヘッダーを奇跡的に挿入し、コンテンツの長さを計算し、境界シーケンスを生成し、必要に応じて境界文字列を挿入し、サーバーの応答を示します。
マルチパート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」を手動で追加しました(読みやすさの理由から)。各行のオクテット(文字)の数は次のとおりです。
オクテットの合計は344であり、各 '\ r\n'を単一の1オクテットシーケンスと見なすと、切望されたコンテンツの長さは344 + 8 = 352になります。
調査結果を要約するには:
Content-Length
の計算方法は、ペイロードのステータスコードやメディアタイプには依存しません。回線上のバイト数です。したがって、マルチパート応答を作成し、バイトをカウントして(そしてCRLF
は2としてカウントされます)、Content-Length
にそれを使用します。
参照: http://httpwg.org/specs/rfc7230.html#message.body.length
HttpメッセージにContent-Length
ヘッダーの場合、このヘッダーはHTTPヘッダーの後に続く正確なバイト数を示します。何でも自由に数えることにした場合\r\n
1バイトにすると、すべてがバラバラになります。キープアライブhttp接続は機能しなくなります。HTTPスタックは次のHTTPメッセージの開始位置を確認できず、ランダムデータをHTTPメッセージであるかのように解析しようとするためです。 。