Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
requests库可以说是Python中使用最广泛的HTTP库了。然而,我相信大多数用户并不知道的是,requests当前稳定版本接受长度小于Content-Length头所给出的长度的响应。如果你自己不仔细检查的话,你可能都没注意就使用了损坏的数据。我亲身经历了这一点,同时这也是我为什么写这篇文章的理由。让我们看看为什么当前requests版本没有做这个检查(这是一个特点,不是bug),和如何在你的脚本中进行手动检查。
什么是Content-Length头?
复习一下,在HTTP协议中,Content-Length头说明了请求或响应体的长度。它以8位字节给出,其中1个8位字节是8位。为了简单起见,通篇文章我将使用术语字节而不是8位字节。通常,Content-Length头用于通知接收方当前请求(或响应)何时完成。没有它的话,你不知道你是否接收到了所有的数据或者你不知道是否有更多的数据需要读取。当然,服务器可以在每个请求或响应结束后断开连接(HTTP1.0就是这样的),但是到了HTTP1.1,除非另有声明所有的连接都被视为持续性的。这显著地加快了通信速度,因为你无需位每个请求单独打开一个连接。
在阅读完上述段落之后,下面的问题可能会出现在你的脑海中:
如果我收到Content-Length的值比收到的字节数少会发生什么?
在某些情况下(网络或服务器端错误),服务器可能会在发送完整消息之前突然断开连接。HTTP1.1 RFC指出:
当允许消息体的消息中给出Content-Length时,其字段值必须与消息体中的字节数完全匹配。当接收并检测到