Content-Length

    最近研究了下这个字段,带着两个问题:

1. 该字段是否必需

    RFC2616 中规定这个字段是必需的,关于 HTTP1.0 的也一样。相关描述如下:

    For compatibility with HTTP/1.0 applications, HTTP/1.1 requests containing a message-body MUST include a valid Content-Length header field unless the server is known to be HTTP/1.1 compliant. If a request contains a message-body and a Content-Length is not given, the server SHOULD respond with 400 (bad request) if it cannot determine the length of the message, or with 411 (length required) if it wishes to insist on receiving a valid Content-Length.

    按照 RFC 的说法,如果未携带该字段,服务器应该返回 4XX 错误。用 socket 程序发包,把该字段删除,测试了 httpd2.2,结果是 200 OK,可能是基于用户友好的角度。但是,message-body 中的所有内容,httpd 都不会接收。测试时,在 httpd 后端部署了 web 容器,打印收到的 body 长度,结果显示为 0。

    结论:该字段是必需的,httpd 会严格按照该字段声明的值来接收 body。但是如果未携带,各个厂商的实现可能略有区别。

2. 该字段是否可以伪造

    RFC 中的说明如下:

    When a Content-Length is given in a message where a message-body is allowed, its field value MUST exactly match the number of OCTETs in the message-body. HTTP/1.1 user agents MUST notify the user when an invalid length is received and detected.

    同样用 socket 发包,使用 httpd2.2。先尝试增加该字段,为真实值 +1,结果 httpd2.2 返回 400 错误。然后尝试减小该字段,分别为真实值 -1、3000、0,发现 httpd2.2 能正确接收,返回结果也都是 200OK。但是,后端的 Web 容器,接收到的长度,都是该字段中声明的值。

    结论:该字段不可伪造。如果增加,会收到 4XX 错误码,如果减少,多余的数据,httpd 会认为是新的请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值