我的 HTTP 過濾器是否必須遵守合約?
標頭編碼/解碼
在標頭的編碼/解碼過程中,如果沒有發送本地回覆,且過濾器返回
FilterHeadersStatus::StopIteration
,如果encodeData()
/decodeData()
返回FilterDataStatus::Continue
,或者透過顯式呼叫continueEncoding()
/continueDecoding()
,則可以恢復處理。在標頭的編碼/解碼過程中,如果沒有發送本地回覆,且過濾器返回
FilterHeadersStatus::StopAllIterationAndBuffer
或FilterHeadersStatus::StopAllIterationAndWatermark
,則可以透過呼叫continueEncoding()
/continueDecoding()
來恢復處理。當使用設定為false的
end_stream
呼叫時,過濾器的decodeHeaders()
實作不得返回FilterHeadersStatus::ContinueAndDontEndStream
。在這種情況下,應返回FilterHeadersStatus::Continue
。過濾器的
encode1xxHeaders()
必須返回Filter1xxHeadersStatus::Continue
或Filter1xxHeadersStatus::StopIteration
。
資料編碼/解碼
在資料的編碼/解碼過程中,如果沒有發送本地回覆,且過濾器返回
FilterDataStatus::StopIterationAndBuffer
、FilterDataStatus::StopIterationAndWatermark
或FilterDataStatus::StopIterationNoBuffer
,如果encodeData()
/decodeData()
返回FilterDataStatus::Continue
,或者透過顯式呼叫continueEncoding()
/continueDecoding()
,則可以恢復處理。
尾部標頭編碼/解碼
在尾部標頭的編碼/解碼過程中,如果沒有發送本地回覆,且過濾器返回
FilterTrailersStatus::StopIteration
,則可以透過顯式呼叫continueEncoding()
/continueDecoding()
來恢復處理。
在 decodeHeaders()
的指定標頭映射中,是否會出現知名的標頭?
解碼過濾器鏈的第一個過濾器將在映射中具有以下標頭
Host
Path
(對於 CONNECT 請求,這可能會被省略)。
儘管這些標頭可能會被解碼過濾器鏈上的其中一個過濾器省略,但在觸發終端過濾器之前,應該重新插入這些標頭。