【问题标题】:HTTP HEAD chunked-encodedHTTP HEAD 分块编码
【发布时间】:2012-09-20 20:40:22
【问题描述】:

我已经实现了一个 HTTP 1.1 服务器。它是一个嵌入式服务器,所以我只支持 RFC 的强制性功能。所有响应均以分块编码方式发送。 由于 HEAD 是强制性的,因此也支持它。

HEAD 是没有正文的 GET。因此,服务器正在发送如下响应以响应 HEAD 请求:

HTTP/1.1 200 OK
Server: testServer
Connection: keep-alive
Transfer-Encoding: chunked

我想知道的是必须添加一个“0\r\n”,因为它需要发出块结束的信号:

 HTTP/1.1 200 OK
 Server: testServer
 Connection: keep-alive
 Transfer-Encoding: chunked

 0

我已经尝试收集了RFC中的相关部分:

“HEAD 方法与 GET 相同,只是服务器不得在响应中返回消息体。”

“对 HEAD 请求方法的所有响应都不得包含消息正文,即使实体标头字段的存在可能会让人相信它们包含。”

"1. 任何“不得”包含消息体的响应消息(例如 1xx、204 和 304 响应以及对 HEAD 请求的任何响应)始终以标头字段后的第一个空行终止,而不考虑消息中存在的实体标头字段。”

到目前为止,我知道我的第一个解决方案(没有 0)是正确的。但是使用 Transfer-encoding: chunked 发送消息似乎很奇怪,它不会以块样式 0\r\n 终止。

【问题讨论】:

  • RFC 明确告诉您不能包含正文,“即使实体标头字段的存在可能会让人相信他们这样做了”。它还能比这清楚多少?
  • 您也倾向于第一个解决方案不添加 0\r\n?传输编码不是实体标头。它是一个通用标题。

标签: http embedded embeddedwebserver


【解决方案1】:

我猜这个问题已经解决了,因为它已经很老了,

最近我开发了一个用于流媒体视频的测试 http 服务器,我想提出我的经验,以便它可以帮助其他人。 首先,“0\r\n”不是块结束的标记,分块的预告片是'0\r\n\r\n'。

对于标题,字符串应该是这样的

"HTTP/1.1 200 OK\r\n" \
"Server: testServer\r\n" \
"Connection: keep-alive\r\n" \
"Transfer-Encoding: chunked\r\n" \
"\r\n"

注意最后一个 CRLF,它表示标题的结尾。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 2012-08-18
    • 2013-08-13
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多