http - 如何使用RoundTrip跟踪请求大小?

标签 http go

为可能出现的新手问题表示歉意,但我正在改编其他人的代码,并且不熟悉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/

相关文章:

java - 在 Spring 中解析 Multipart/mixed

javascript - Nodejs 响应作为字符串而不是 JSON 发送

postgresql - Golang 测试中可重用的组件和固定装置

php - 高语 : create a function that accept an interface (I came from PHP)

go - 尝试在Go中设置Cookie,但收到一条CORS错误,指出Access-Control-Allow-Credentials未设置为true

arrays - 将数组作为golang的输入

http - 去 - JSON-RPC - "too many colons"

http - Golang 中的服务器头中间件

http - 在 ReSTLet 客户端请求中使用参数

http - 一个端口可以监听两种不同的协议(protocol)吗?