没有http标头的Http响应

Ste*_*and 5 http http-headers

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

在那个问题中,OP想知道http响应中的必要字段,其中一条评论指出它们在服务器端可能并不重要.

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

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

sla*_*pon 8

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

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

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

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

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

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

来自HTTP/1.1规范部分3.1.1.5.内容类型:

生成包含有效负载主体的消息的发送方应该在该消息中生成Content-Type标头字段,除非发送方不知道所包含的表示的预期媒体类型.如果Content-Type头字段不存在,则接收者可以采用媒体类型"application/octet-stream"([RFC2046],第4.5.1节)或检查数据以确定其类型.

  • 你赢了,我正在写一个小方法让我的输出头. (2认同)