最近用 Golang 撰寫 Service Unit Test 時,練了一下 net/http 要如何處理 HTTP Response Header Location 的處理。主要是在使用 net/http 的 http.Client 時,可以加設定 CheckRedirect 的機制來阻擋 URL Redirect 的行為,藉以檢驗 URL Redirect 是否正確。
//httpClient := http.DefaultClienthttpClient := &http.Client{}httpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error {return http.ErrUseLastResponse}if jar, err := cookiejar.New(nil); err == nil {httpClient.Jar = jar}
如此,做 Service Unit Test 時,在發送 HTTP GET request or HTTP HEAD request 時,可以停下來,看看要跳轉到哪裡,以此判斷跳轉機制是否正常。
接著,碰到了另一個問題: 在 follow URL Redirect 後,似乎跳轉過程中產生的 Cookie 都沒有被記錄下來?例如最後的 response.Cookies() 輸出,的確只列出最後的 Response Cookies 資料。這時想要驗證中間的 Cookie 資訊,則需要瀏覽 httpClient.Jar 資料:
for _, c := range(httpClient.Jar.Cookies(res.Request.URL)) {fmt.Println(c)}
如此就可以搞定 URL Redirect 驗證,以及全部過程的產生的 Cookie 檢查!當然,若要更細膩地去追蹤每次 URL Redirect 時,產生的 Response Cookies 資料,可以透過 httpClient.CheckRedirect 那處理:
httpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error {for _, c := range (req.Response.Cookies()) {fmt.Println(c)}}
參考資料:
- https://pkg.go.dev/net/http#Client
- https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/client.go
- https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/client.go;l=493
- https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/client.go;l=811
- https://pkg.go.dev/net/http/cookiejar#Jar.Cookies
- https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/cookiejar/jar.go
沒有留言:
張貼留言