如何測試代理路徑中的 Expect: 100-continue 大型檔案上傳

大型網際網路上傳資料區塊在代理檢查點等待,通過驗證後再流向伺服器

大型上傳的重複成本很高。HTTP Expect: 100-continue 允許 HTTP/1.1 用戶端先傳送標頭並短暫等待;若伺服器只依方法、路徑或憑證就能拒絕要求,用戶端無須先傳完整內容。代理可能刪除標頭、吞掉暫時回應、延遲超過用戶端計時器、在錯誤節點產生回應,或在最終拒絕前提前轉送內容,破壞這項機制。

本指南用於代理採購與營運驗收。只測試自有或已獲授權的端點與檔案,不得未經許可探測第三方上傳服務。

釐清預期交換

用戶端先傳送要求行與標頭(包含 Expect: 100-continue),暫不傳內容。HTTP/1.1 來源站可依標頭立即回傳最終拒絕,或先回傳 100 Continue,收完內容後再回傳唯一最終回應。中介設備通常應轉送資訊性回應,除非預期是它自行加入的。

用戶端不能無限等待。若設定的預期計時器內沒有暫時或最終回應,它可能開始傳送內容。計時器是用戶端行為,因此測試必須記錄時序,不能假設所有函式庫一致。

HTTP/2 與 HTTP/3 可終止單一要求串流而不關閉整條連線,用戶端未必以相同方式使用這項機制。應分別記錄代理兩側的實際協定,不要假定 HTTP/1.1 交換在轉換後完全不變。

建立自有上傳夾具

建立四種確定模式:

模式標頭階段內容預期
接受回傳100,再回傳最終成功完整內容只接收一次
未授權內容前回傳最終401不接收內容
不支援預期回傳最終417僅依明確政策決定是否重試
延遲控制暫時回應延遲測出用戶端等待門檻

使用不同大小的合成非敏感負載。記錄負載摘要、宣告長度、實收長度與最終摘要,並讓伺服器統計每個回應前後收到的位元組。

按階段蒐集證據

每次記錄測試編號、路由別名、用戶端版本、用戶端到代理協定、代理到來源站協定、是否看見 Expect、第一個暫時狀態、暫時回應耗時、內容開始時間、最終回應前位元組數、最終狀態、實收位元組、摘要是否符合、連線是否重用與重試次數。

路由與工作階段識別碼只保留雜湊,不記錄代理密碼、驗證標頭、Cookie、權杖或私有負載。

先建立直連基線

使用真實生產用戶端,在不經代理時執行全部模式。確認接受模式在 100 後只傳一次內容;標頭階段的 401 不傳內容;417 符合用戶端文件政策;延遲模式能呈現實際等待計時器。

同時測試小型與大型負載。部分用戶端會依內容大小、方法或長度是否已知加入或抑制 Expect。以線路證據為準,不能只看命令設定。

逐條加入代理路徑

分別測試每個閘道、區域、驗證方式與位址族,固定用戶端、負載、端點與逾時。比較來源站是否收到 Expect、用戶端是否收到 100、內容是否提前開始、最終拒絕是否停止內容、協定轉換是否改變順序,以及最終回應後連線能否安全重用。

標頭消失或改變時,使用代理要求標頭完整性測試;最終結果可搭配代理回應完整性測試驗證。

驗證提前拒絕節省頻寬

在未授權模式,只使用刻意無效的實驗憑證。端點應依標頭回傳最終 401,健康路徑不應繼續上傳大型內容。

同時測量用戶端傳送與來源站接收位元組。即使來源站沒有收到,代理仍可能緩衝資料,所以兩個視角都重要。負面測試不得使用真實憑證。

安全處理 417

417 Expectation Failed 表示回應鏈不支援該預期。部分用戶端可能移除 Expect 後再次要求,但這不代表所有自動重試都安全。

只有當應用能證明第一次操作未生效,或服務接受冪等機制時才能重試。限制要求次數、總時間與位元組,並在大量啟用回退前使用重試風暴預防指南

常見故障歸因

現象可能原因
每次上傳前固定停頓用戶端等待未到達的100
來源站看見Expect,用戶端沒看見100代理或協定轉換吞掉暫時回應
來源站從未看見Expect用戶端抑制或代理刪除
拒絕前內容已到達計時器到期、代理提前緩衝或用戶端未等待
401後仍傳完整內容回應處理或緩衝錯誤
收到兩份完整內容417或傳輸重試失控
只有直連成功閘道處理、協定轉換或逾時不符

不要把所有延遲都歸因於出口 IP 品質。在路由證據證明前,它首先是訊息流與時序問題。

驗收門檻

路由僅在以下條件全部滿足時通過:接受模式產生一個驗證成功的內容和一個最終回應;標頭階段拒絕能避免不必要上傳;暫時與最終回應順序正確;計時器有界;重試不會複製應用效果;日誌能定位失敗階段且不含祕密。

還應追蹤暫時回應耗時、拒絕節省位元組、完整上傳率、重複內容率、最終回應延遲與每次驗證成功上傳成本。單看吞吐量不能證明交握正確。

發布檢查清單

  • 已掌握確切用戶端版本的直連行為。
  • 已測試小型、大型、已知長度與串流內容。
  • 已記錄代理兩側協定。
  • 已涵蓋接受、401、417與延遲模式。
  • 已比較用戶端與來源站位元組計數。
  • 每個接受要求只產生一次業務結果。
  • 最終拒絕能停止內容。
  • Expect計時器與上傳總期限有界。
  • 重試必須可安全重放或具備冪等性。
  • 日誌不含憑證及私有內容。

常見問題

所有上傳都應使用 Expect: 100-continue 嗎?

不應。對小型內容,額外往返成本可能高於節省。應測試用戶端門檻與業務拒絕機率。

沒有收到100一定是代理故障嗎?

不一定。伺服器可立即回傳最終回應,用戶端也可能在計時器到期後開始傳送。需比較直連與代理線路證據。

收到100是否代表上傳成功?

不是。它只表示初始要求尚未被拒絕,用戶端仍需接收並驗證最終回應。

417是否應觸發代理輪換?

不應。它描述回應鏈對預期的支援,不代表住宅 IP 信譽。應先診斷協定路徑。

合規說明

上傳與拒絕測試只能針對自有或明確獲授權的系統。遵守服務限制、資料規則與代理政策;使用合成負載並最小化保留,不得利用代理輪換規避上傳拒絕或存取控制。