8

发送 HTTP 响应时,我应该用换行符(行分隔符)结束响应正文(内容本身)吗?

如果是这样,我是否应该在 Content-Length 中包含行分隔符的大小(如果发送 \r\n,我猜想将计数增加 2)?

4

3 回答 3

9

发送 HTTP 响应时,我应该用换行符(行分隔符)结束响应正文(内容本身)吗?如果是这样,我是否应该在 Content-Length 中包含行分隔符的大小(如果发送 \r\n,我猜想将计数增加 2)?

在 HTTP 响应的消息正文中发送的资源数据可能包含其自己的换行符(这在文本文件等中很常见),但就 HTTP 本身而言,这是任意数据。消息数据中的换行符不是 HTTP 响应本身的一部分。HTTP响应通过到达Content-Length(即资源数据的字节大小)终止,除非Transfer-Encoding使用(在这种情况下Content-Length被忽略,并且使用chunked编码,这是自终止的),或者连接在最后关闭的回应。这在RFC 2616 第 4.4 节中有描述:

4.4 消息长度

   消息的传输长度是消息体的长度,如
   它出现在消息中;也就是说,在任何传输编码具有
   被应用。当消息中包含消息正文时,
   该主体的传输长度由以下之一确定
   (按优先顺序):

   1.任何“不得”包含消息体的响应消息(例如
     作为 1xx、204 和 304 响应以及对 HEAD 的任何响应
     request) 总是以第一个空行结束
     头字段,无论实体头字段存在于
     消息。

   2.如果存在传输编码头字段(第 14.41 节)并且
     具有除“identity”以外的任何值,则传输长度为
     通过使用“分块”传输编码(第 3.6 节)定义,
     除非通过关闭连接来终止消息。

   3.如果存在 Content-Length 标头字段(第 14.13 节),则其
     OCTET 中的十进制值表示实体长度和
     传输长度。不得发送 Content-Length 标头字段
     如果这两个长度不同(即,如果传输编码
     头字段存在)。如果同时收到一条消息
     Transfer-Encoding 头域和一个 Content-Length 头域,
     后者必须被忽略。

   4.如果消息使用媒体类型“multipart/byteranges”,并且
     传输长度没有另外指定,那么这个自
     定界媒体类型定义传输长度。这种媒体类型
     除非发件人知道收件人可以解析,否则不得使用
     它; 请求中存在具有多个字节的 Range 标头-
     来自 1.1 客户端的范围说明符意味着客户端可以解析
     多部分/字节范围响应。

       范围标头可能由不支持的 1.0 代理转发
       了解多部分/字节范围;在这种情况下,服务器必须
       使用第 1,3 或 5 项中定义的方法分隔消息
       本节。

   5.由服务器关闭连接。(关闭连接
     不能用于指示请求正文的结束,因为
     不会让服务器发回响应。)

   为了与 HTTP/1.0 应用程序兼容,HTTP/1.1 请求
   包含消息体必须包含有效的 Content-Length 标头
   字段,除非已知服务器符合 HTTP/1.1。如果一个
   请求包含消息体并且没有给出 Content-Length,
   如果不能,服务器应该以 400(错误请求)响应
   确定消息的长度,或者使用 411(需要长度)如果
   它希望坚持接收有效的内容长度。

   所有接收实体的 HTTP/1.1 应用程序必须接受
   “分块”传输编码(第 3.6 节),因此允许这种机制
   用于无法确定消息长度时的消息
   提前。

   消息不能同时包含 Content-Length 头域和
   非身份传输编码。如果消息确实包含非
   身份传输编码,内容长度必须被忽略。

   当在消息正文中给出 Content-Length 时
   允许,其字段值必须与
   消息体。HTTP/1.1 用户代理必须通知用户
   接收并检测到无效长度。
于 2015-06-06T00:02:38.237 回答
3

我在RFC 2616中没有看到这样的内容:

响应 = 状态行;第 6.1 节
                *(( 通用标题;第 4.5 节
                 | 响应头;第 6.2 节
                 | 实体头)CRLF);第 7.1 节
                CRLF
                [ 邮件正文 ] ; 第 7.2 节

响应中有两个换行符,都在标头的末尾,而不是在消息体的末尾。标头将描述消息体是如何终止的。

于 2012-12-11T13:21:56.837 回答
1

发送 HTTP 响应时,我应该用换行符(行分隔符)结束响应正文(内容本身)吗?

RFC 不要求您发送换行符。消息长度不是根据这种换行符的存在来计算的。请参阅描述如何计算消息长度的消息长度部分。

于 2012-12-11T13:27:58.503 回答