2016-10-16 77 views
0

HTTP/1.1規範定義了以下關於具有多個報頭字段的請求:HTTP驗證:結合多個報頭

發件人必須不在消息產生多個首標字段具有相同的字段 名稱,除非或者是整個該頭字段的字段值被定義爲逗號分隔列表[即,#(值)] 或者頭部字段是衆所周知的例外(如下所述)。

接收者可以與相同的場 名稱組合多個報頭字段爲一個「字段名:字段值」對,在不改變消息的 語義,由每個隨後的字段值追加到 組合字段按逗號分隔的順序值。其中接收到具有相同字段名稱的頭字段的訂單 是 ,因此對組合字段 的解釋值有重要意義;當 轉發消息時,代理不得更改這些字段值的順序。

對於解析請求:

  • 我需要首先合併標題(用逗號分隔),然後驗證該合併的頭?

  • 我需要單獨驗證每個頭,它們合併成一個頭之前?

  • 這是不確定的,而且我可以選擇任何選項,我喜歡?

一個實例,其中這使得有差別,是:

GET/HTTP/1.1 
Host: 127.0.0.1 
Upgrade: foo 
Upgrade: 
Upgrade: bar 

在此,通過本身第二單獨報頭是無效的(作爲升級頭需要至少1協議)。但是,所有三個標頭的組合變爲允許的foo,,bar

當規範說明它至少需要1件東西時:這是用於完整組合標題,還是用於單獨標題?

+0

你說「'foo,bar'這是允許的」; '升級'採用以逗號分隔的標記,而中間的空字符串不是有效的標記。你能澄清什麼可以允許嗎?否則,你提供的兩種表格都是無效的。 – Joe

+1

@Joe - 參見https://greenbytes.de/tech/webdav/rfc7230.html#abnf.extension的末尾 –

+0

該規範聲明「發件人不能生成空的列表元素」,但建議服務器容忍這一點(並不少見)錯誤。爲了驗證,而不是現實世界的服務器,我期望一個不太寬容的解析。 – Joe

回答

0

它用於完全組合的標題字段。因此,必須接受沒有字段值的單個「升級:」(儘管發送是非法的)。

+0

Source?........ – Etan

+0

我澄清了我的答案:空值必須由收件人接受(由於歷史原因),但不得發送。來源:https://greenbytes.de/tech/webdav/rfc7230.html#abnf.extension plus常識... –

+0

'相反,以下值將無效,因爲至少需要一個非空元素示例列表製作:「」 - 如果是完全組合的標題字段,則接受它。如果它是每個標題字段,則會被拒絕。這就是我在問題中所說的^^如果它是組合字段的計數,它也被允許發送('除非該頭部字段的整個字段值被定義爲逗號分隔列表[即,#(值)]') – Etan