本文為您列出了邊緣程序ER(EdgeRoutine)的Fetch相關的常見問題。
Fetch支持解壓縮嗎?
Fetch默認會自動解壓縮,有以下三種解壓縮行為:
decompress:默認行為,讀取response的content-encoding頭,從右往左數,第一個非Identity的值作為解壓縮算法,例如
content-encoding: gzip, identity
,選擇gzip當作算法。如果您刪除了該算法參數,刪除后的頭如下:content-encoding:identity, gzip
表示Fetch后返回的原始頭,content-encoding: identity
表示被ER刪除后的頭。content-encoding: gzip
表示Fetch后返回的原始頭,content-encoding
表示被ER刪除后的頭。
說明刪除頭后內容會透明顯示,就像源站沒有返回gzip的內容。如果ER無法識別對應的算法會拋出異常,目前僅支持gzip算法,未來可能會支持brotli算法。
fallbackIdentity:與decompress相似,無法解壓縮時不會報錯,直接當作identity處理。這個異常是有意為之,因為內容是壓縮過的,你的讀取可能沒意義,因為你可能需要處理。
manual:不解壓縮。
您可以通過以下方式手動設置Fetch的解壓縮策略:
fetch(url, {decompress: "manual"})
fetch(url, {decompress: "fallbackIdentity"})
Fetch的最大限制是多少?
所有的上下文即瀏覽器請求的邊緣截獲,發起的子請求默認最大限制是32個,每一次3xx跟隨也算32個,將來支持的cache API也算32個,如果您需要提高限制配額,請填寫信息申請。
ER可以識別非法URL嗎?
ER無法識別非法的URL,如果您的URL含有非法字符,會提示沒有正確的encode,請您確保URL正確。
連接池的最大限制是多少?
ER會自動為Fetch做連接池功能,用以規避TCP或SSL的握手消耗。連接池的數量限制默認是128,超過128個連接后,連接池將不再進行cache連接,您可以申請提升配置,增加連接池的上限。
連接池屬于用戶級別的連接池,非請求級別。如果當前的連接池為空,ER會嘗試新建連接。當您完整讀取了某次請求的回復body時,ER才能cache連接。
以下代碼可以確保將Fetch的body讀取完畢。
async function fetchAndIgnore(url, options) {
let response = await fetch(url, options);
// 該方法調用可以使ER強制忽略回復的body,并保證body被讀取完畢。
await response.ignore();
}