没有http标头的Http响应

时间:2012-11-20 23:08:08

标签: http http-headers

我已经编写了一个迷你极简主义的http服务器原型(受到升级asio示例的极大启发),而且目前我还没有在服务器响应中放置任何http标头,只有html字符串内容。令人惊讶的是,它的工作正常。

In that question OP想知道http响应中的必要字段,其中一条评论表明它们在服务器端可能并不重要。

我还没有尝试过立即响应二进制图像文件或gzip压缩文件,在这种情况下我认为必须有一个http标头。

但是对于纯文本响应(html,css和xml输出),在我的服务器响应中包含http标头是否可以从不?可能存在哪些风险/错误?

1 个答案:

答案 0 :(得分:8)

至少,您必须提供包含状态行和日期的标头。

作为编写了许多协议解析器的人,我求你,在我的数字隐喻的膝盖上,请哦,请不要因为你最喜欢的浏览器让你完全忽略规范侥幸逃脱

只要它生成的数据是正确的,创建一个功能最少的程序就完美了。这不应该是一个主要的负担,因为您只需要在响应开始时添加三行。其中一行是空白!请花几分钟时间写下两条光荣的代码,这样可以使您的回复数据符合规范。

您真正应该提供的标题是:

  • 状态行(必填)
  • 日期标题(必填)
  • 内容类型(强烈推荐)
  • 内容长度(强烈推荐),除非您使用的是分块编码
  • 如果您要返回HTTP / 1.1状态行,并且未提供有效的内容长度或使用分块编码,则将Connection: close添加到标题中
  • 将标题与正文分开的空白行(必填)

您可以选择不使用响应发送内容类型,但您必须了解客户端可能不知道如何处理数据。客户端必须猜测它是什么类型的数据。浏览器可能决定将其视为下载文件而不是显示它。自动进程(某人的bash / curl脚本)可能会合理地确定数据不是预期类型,因此应将其丢弃。

来自HTTP/1.1 Specification部分3.1.1.5。内容类型:

  

生成包含有效负载主体的消息的发送方应该是   除非该消息,否则在该消息中生成Content-Type头字段   所包含的表示的预期媒体类型是未知的   发件人。如果Content-Type标头字段不存在,则为收件人   可以假定媒体类型为“application / octet-stream”   ([RFC2046],第4.5.1节)或检查数据以确定其类型。