HTTP/1.0响应是否需要Content-Length头?

71
Content-Length头信息在HTTP/1.0响应中是否必需?HTTP规范提到它在请求中是必需的,但没有提及任何关于响应的说明: http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html#Content-Length “所有包含实体主体(entity body)的HTTP/1.0请求消息都需要一个有效的Content-Length字段值。”
如果Content-Length头不是响应所必需的,那么客户端如何读取大于1MB的响应?

1
对于请求者,请访问https://dev59.com/I2Uq5IYBdhLWcg3wJNBA。 - Pacerier
1个回答

71

规范的第10.4节(你提供的链接)并没有说明响应本身的要求,而是链接到第7.2.2节,该节指定服务器可以通过以下方式指示包含实体正文的响应的长度:

  • 发送一个 Content-Length头部;或者
  • 在整个响应发送完毕后关闭连接。

第7.2节指出,对于HEAD请求、1xx、204或304响应,不应包括实体正文,因此不需要包括Content-Length头部; 而对于其他所有响应,必须包括一个实体正文或定义为零(0)的Content-Length头字段。

因此回答这个问题:当没有接收到Content-Length时,客户端将继续读取,直到服务器关闭连接。


4
我相信最终结论并不完全准确。“客户端会一直读取,直到服务器关闭连接或收到了宣布的内容长度;在此之后,(TCP)连接可以用于另一个请求。”如果我有错误,请告诉我。 - dot slash hack
@KemHeyndels 好的,问题基本上是在没有 Content-Length 标头时会发生什么,所以... - michaelb958--GoFundMonica
2
@KemHeyndels 我稍微澄清了一下答案;那是我刚入门时写的,可能有点不清楚。感谢你提醒我。 - michaelb958--GoFundMonica
我通过(艰难的)经验学到,如果响应“很大”,包括Content-Length可以防止问题。不确定什么是“很大”,但当我包括它时,我的API开始处理超过100k的响应。 - ScottyB
@ScottyB 有道理——可能是某个东西默认使用了100k缓冲区。 - michaelb958--GoFundMonica
1
特别是在Android上,Content-Length是必需的。我通过这种方式学到了:https://stackoverflow.com/questions/51685816/android-could-not-receive-form-submit-response如果没有Content-Type,当服务器关闭连接(读取数据,然后抛出异常)时,Android会给出一个异常。只要加上Content-Type,问题就消失了。这是那些不同库可能希望强制执行的非标准事项之一,因此最好将其放置,即使RFC没有规定它。 - Ouroboros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接