gpt4 book ai didi

http - 在 http.Handler ServeHTTP 函数中计算 Go 中发送和接收的字节数?

转载 作者:IT王子 更新时间:2023-10-29 01:41:32 25 4
gpt4 key购买 nike

Go 中的 ServeHTTP 函数如何计算发送和接收的字节数?

计数需要相对准确。跳过连接建立并不理想,但可以接受。但必须包含 header 。

它还需要快速。迭代通常太慢。

计数本身不需要发生在 ServeHTTP 中,只要给定连接的计数可用于 ServeHTTP

这也不能破坏 HTTPS 或 HTTP/2。

我尝试过的事情

通过遍历 Request header ,可以获得对接收字节的粗略、缓慢的估计。这太慢了,而且 Go 标准库删除并组合了 header ,因此也不准确。

我尝试编写一个拦截器 Listener,它创建了一个内部 tls.Listennet.Listen Listener,并且其 Accept () 函数从内部 Listener 的 Accept() 得到一个 net.Conn,然后将其包装在一个拦截的 net.ConnReadWrite 函数调用真正的 net.Conn 并计算它们的读取和写入。然后可以通过互斥共享变量使这些计数可用于 ServeHTTP 函数。

问题是,拦截 Conn 破坏了 HTTP/2,因为 Go 的内部库将 net.Conn 转换为 *tls.Conn (例如 https://golang.org/src/net/http/server.go#L1730 ),并且在 Go 中似乎不可能包装对象,同时仍然使转换成功(如果是,它会解决这个问题)。

通过计算写入 ResponseWriter 的内容,可以相对准确地计算发送的字节数。通过 Request.Body 也可以计算 HTTP 正文中接收到的字节数。这里的关键问题似乎是快速准确地计算请求 header 字节数。同样,计算连接建立字节数也是理想的。

这可能吗?怎么办?

最佳答案

我认为这是可能的,但我不能说我已经做到了。但是,基于浏览 HTTP 服务器和 TLS 监听器的 stdlib 实现,我不明白为什么它不可能;关键是在之前 TLS 而不是之后 包装连接。这还可以让您更准确地了解线路上的字节数,而不是解密字节数。

你已经有了一个拦截Listener,你只需要将它插入到正确的位置。与其将 Listener 传递给 http.Serve(或将其插入的任何位置),不如将其传递给 tls.NewListener首先,它将它包装在 TLS 处理程序中,然后将结果传递给 HTTP 服务器。

当然,如果您想要解密字节数而不是线路字节数,您可能是 SOL - 包装 net.Conn 不会让您到达那里。您可能必须尽最大努力计算标题和正文。

关于http - 在 http.Handler ServeHTTP 函数中计算 Go 中发送和接收的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43944378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com