我有一個實現http.Handler
接口的類型,其中在其ServeHTTP
方法中檢查傳入的HTTP請求,執行一些操作,然後將請求轉發到反向代理處理程序(httputil.NewSingleHostReverseProxy
)。讀取http.Request的主體而不修改請求狀態?
這工作正常,只要我只檢查基本的請求屬性,如URL或標題。
當我想檢查傳入的POST請求的正文時,例如通過調用req.ParseForm()
然後使用req.Form
財產,我碰到一個錯誤,一旦請求傳遞到反向代理:
http: proxy error: http: Request.ContentLength=687 with Body length 0
我想這是因爲着眼於HTTP的身體請求導致req.Body.Reader
流被耗盡,這意味着代理處理程序不能再次讀取它。
我一直玩的東西,如io.Copy()
和bufio.Peek()
,但我沒有真正得到任何地方。
有沒有辦法窺視HTTP請求體(並使用內置的解析req.ParseForm
等),同時保留原始請求對象的原始狀態,以便它可以傳遞給反向代理?
您是否嘗試用像'bytes.Reader'這樣的可搜索閱讀器替換'Body'?您可以將'Body'設置爲實現'ReadCloser'的每個值。 – nemo
未經測試(但值得一試):根據需要製作請求的深層副本,即所有但不是Body和。*表單。然後使用io.TeeReader來克隆Request.Body,將其包裝在NopCloser中並填充到請求的深層拷貝中。將深層副本傳遞給反向代理。 – Volker