2017-02-25 38 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,它會調試打印所有收到的標題值,包括僞標題。

相關問題