2017-02-25 112 views
0

我的项目,我有一些硬编码的HTTP状态代码和说明,如:使用HTTP/2时,我可以返回“HTTP/1.1”协议版本吗?

$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。或者如果没关系。

回答

0

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

所以今天的主要问题是什么,当你拨打

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

如果框架将在HTTP/2的情况下解析此行,只提取422并把它放在你选择的框架做:status pseudoheader然后一切都很好。如果它不解析它,那么我不知道它将如何设置状态码。你的框架/网络服务器也不能使用这个字符串作为正常的头 - 因为你在这里设置的只是一个字符串值。设置普通标题需要标题的名称和值。所以我猜你的框架只是删除不相关的数据,一切都很好。

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

相关问题