15

たとえば、コンテンツの長さを計算するにはどうすればよいですか。

POST /Upload/ HTTP/1.1
Host: test.lan
User-Agent: Shockwave Flash
Connection: Keep-Alive
Cache-Control: no-cache
Accept: text/*
Content-Length: ?????
Content-Type: multipart/form-data; boundary=----------------------------4d2179e6b3c0

------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="Filename"

phpinfo.php
------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="ASPSESSID"

6e223eb1c7561e9c599f03cc04e9444b
------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="Filedata"; filename="phpinfo.php"
Content-Type: application/octet-stream

<? phpinfo(); ?>
------------------------------4d2179e6b3c0
Content-Disposition: form-data; name="Upload"

Submit Query
------------------------------4d2179e6b3c0--
4

1 に答える 1

18

値は、メッセージ ヘッダーの終了Content-Lengthのすべてのデータを合計して計算する必要があります。あなたの例の場合、これはこの時点以降のすべてです(読みやすくするために文字が含まれています):CRLF

...
Content-Length: ?????\r\n
Content-Type: multipart/form-data; boundary=--------------------4d2179e6b3c0\r\n
\r\n

最初の空行 ( ) の後に続くすべて (\r\n境界区切り文字を含む) は、合計の長さに数えられる必要があります。実際には、これは通常Content-Length、完全なメッセージ エンティティ ボディを生成した後にヘッダー値を表にする必要があることを意味します。メッセージの本文全体を取得したら、ヘッダーを先頭に追加して、完全な HTTP メッセージを作成できます。

HTTP 仕様によると、技術的にヘッダーを指定する必要はありません。RFC 2616 14.13Content-Lengthから:

アプリケーションは、セクション 4.4 のルールで禁止されていない限り、このフィールドを使用してメッセージ本文の転送長を示す必要があります。

ただし、これはほとんどのサーバーにとって非常に標準的な要件であり、Content-Lengthが欠落しているか正しく指定されていない場合、通常はエラー応答を返します。

于 2012-08-25T05:25:39.397 に答える