如何计算内容长度,例如:
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--
答案 0 :(得分:19)
{/ 1}}值应通过在终止消息标头后总计所有数据来计算。对于您的示例,这是此后的所有内容(为了便于阅读,包含Content-Length
个字符):
CRLF
第一个空行(...
Content-Length: ?????\r\n
Content-Type: multipart/form-data; boundary=--------------------4d2179e6b3c0\r\n
\r\n
)之后的所有内容 - 包括您的边界分隔符 - 都应计入总长度。实际上,这通常意味着您需要在生成完整的消息实体主体后将\r\n
标头值制成表格。获得完整的消息后,您可以将其与标头一起添加,以创建完整的HTTP消息。
根据HTTP规范,技术上 required 指定Content-Length
标头。来自RFC 2616 14.13:
应用程序应该使用此字段来指示消息正文的传输长度,除非4.4节中的规则禁止这样做。
但是,对于大多数服务器来说,这是一个非常标准的要求,如果Content-Length
丢失或指定不正确,通常会发回错误响应。