为可能出现的新手问题表示歉意,但我正在改编其他人的代码,并且不熟悉Go语言。
在代理HTTP请求的代码中,我有以下部分
func handleHTTP(w http.ResponseWriter, req *http.Request) {
resp, err := http.DefaultTransport.RoundTrip(req)
..
我知道req包含一个流主体,因此没有立即长度,因为我希望RoundTrip能够读取这样的流。我的问题是我该如何修改这段代码,以便在流被完全消耗之后可以拥有请求主体的最终大小...谢谢
最佳答案
Request
具有ContentLength
作为可用属性,在某些情况下您也许可以使用它。虽然如果请求使用Tranfer-Encoding,但我认为此值设置为-1(也许为0)。
否则,我认为您可以使用自己的io.ReadCloser实现包装req.Body。像这样:
type RecordLengthReadCloser struct {
io.ReadCloser
length int
}
func (rc *RecordLengthReadCloser) Read(p []byte) (int, error) {
n, err := rc.ReadCloser.Read(p)
rc.length += n
return n, err
}
func handleHTTP(w http.ResponseWriter, req *http.Request) {
rc := &RecordLengthReadCloser{ReadCloser: req.Body}
req.Body = rc
resp, err := http.DefaultTransport.RoundTrip(req)
fmt.Println(rc.length)
_, _ = resp, err
}
这可能有我不知道的问题,我不确定您是否可以自由地重新分配req.Body而不会出现问题。
关于http - 如何使用RoundTrip跟踪请求大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65151727/