首页 > 解决方案 > 如何使用 RoundTrip 跟踪请求大小?

问题描述

为潜在的新手问题道歉,但我正在改编别人的代码并且不熟悉 Go 语言。

在代理 http 请求的代码中,我有以下部分

func handleHTTP(w http.ResponseWriter, req *http.Request) {
    resp, err := http.DefaultTransport.RoundTrip(req)
..

我知道 req 包括一个流式主体,因此没有立即可用的长度,因为我希望 RoundTrip 读取这样的流。我的问题是如何调整这样的代码,以便在流完全消耗后获得请求正文的最终大小......

谢谢


标签: httpgo

解决方案


Request有 aContentLength作为可用属性,在某些情况下您可能只能使用它。虽然如果请求使用传输编码,我认为这个值设置为 -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 没有问题。


推荐阅读