http - 如何使用 RoundTrip 跟踪请求大小?
问题描述
为潜在的新手问题道歉,但我正在改编别人的代码并且不熟悉 Go 语言。
在代理 http 请求的代码中,我有以下部分
func handleHTTP(w http.ResponseWriter, req *http.Request) {
resp, err := http.DefaultTransport.RoundTrip(req)
..
我知道 req 包括一个流式主体,因此没有立即可用的长度,因为我希望 RoundTrip 读取这样的流。我的问题是如何调整这样的代码,以便在流完全消耗后获得请求正文的最终大小......
谢谢
解决方案
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 没有问题。
推荐阅读
- laravel - 如何在 Laravel API 中通过文件上传使用 PUT 方法
- terraform - 如何在 Terraform Cloud 中输入复杂(嵌套)变量?
- python - 如何使用用于在 Python 中悬停按钮的图像更改按钮的图像?
- r - 如何在 R 中的同一图中绘制多组特征向量?
- mysql - 优化 MySQL 查询
- python - 与 Visual Studio 相关的 Python 3.9 中的 pip install 错误
- arrays - PowerShell 空数组初始化在条件变量分配中失败
- python - 如何使用多进程在 python 中更新 pandas.dataframe?
- python-3.x - 试图计算校验和但最终陷入无限循环 - 请解释一下?
- javascript - 我正在尝试使用正则表达式来查找一行中前 20 个字符中的所有模式