使用HTTP / 2时,我可以返回“HTTP / 1.1”协议版本吗?

时间:2017-02-25 12:32:10

标签: http http2 http2-lawyers

在我的项目中,我有一些硬编码的HTTP状态代码和描述,例如:

$this->output->set_header("HTTP/1.1 422 Unprocessable entity");

我不清楚Section 8.1.3 of HTTP/2 specs因为它看起来像HTTP / 2服务器不再返回完整的标题行(协议,状态代码和状态描述)。例如:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123

会变成:

HEADERS
  + END_STREAM
  + END_HEADERS
:status = 200
content-type = image/jpeg
content-length = 123

使用我的demo时,浏览器看起来不会受到以“HTTP / 1.1”开头的响应的困扰。

所以我想知道是否迫切需要依赖框架来返回正确的状态代码(框架构建一个以$ _SERVER ['SERVER_PROTOCOL']开头的字符串)。请参阅此SO question以了解实施情况。或者如果没关系。

1 个答案:

答案 0 :(得分:1)

正如您所说,HTTP / 2协议中没有文本状态行,可用于传输包含" HTTP / 1.1"的字符串。 HTTP / 2仅在伪头值:status中以数字形式传输状态代码,该值将由客户端获取。

所以主要的问题是当你打电话时你选择的框架在做什么

$this->output->set_header("HTTP/1.1 422 Unprocessable entity");

如果框架在HTTP / 2情况下解析这一行,只提取422并将其放在:status伪头中,那么一切都很好。如果它不解析它,那么我不知道它将如何设置状态代码。您的框架/网络服务器也不能将此字符串用作普通标头 - 因为您在此处设置的只是一个字符串值。设置普通标头将需要标头的名称和值。所以我猜你的框架只是删除了无关的数据,一切都很好。

如果您感兴趣,可以使用nghttp2命令行工具nghttp来调试连接。拨打nghttp -v https://your-host之类的电话,它会调试打印所有收到的标头值,包括伪标题。