后台:修复直播开播页空白(补全 watch 导入);控制台展示应用带宽观测与 HTTP 流量统计
Made-with: Cursor
This commit is contained in:
53
server/middleware/traffic_meter.go
Normal file
53
server/middleware/traffic_meter.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"yh_web/server/pkg/traffic"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type countReadCloser struct {
|
||||
io.ReadCloser
|
||||
}
|
||||
|
||||
func (c *countReadCloser) Read(p []byte) (int, error) {
|
||||
n, err := c.ReadCloser.Read(p)
|
||||
if n > 0 {
|
||||
traffic.AddIn(n)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
type meterResponseWriter struct {
|
||||
gin.ResponseWriter
|
||||
}
|
||||
|
||||
func (w *meterResponseWriter) Write(p []byte) (int, error) {
|
||||
n, err := w.ResponseWriter.Write(p)
|
||||
if n > 0 {
|
||||
traffic.AddOut(n)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (w *meterResponseWriter) WriteString(s string) (int, error) {
|
||||
n, err := w.ResponseWriter.WriteString(s)
|
||||
if n > 0 {
|
||||
traffic.AddOut(n)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
// TrafficMeter 统计 HTTP 请求体与响应体字节量(进程级,非网卡级)。
|
||||
func TrafficMeter() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
if c.Request.Body != nil && c.Request.Body != http.NoBody {
|
||||
c.Request.Body = &countReadCloser{ReadCloser: c.Request.Body}
|
||||
}
|
||||
c.Writer = &meterResponseWriter{ResponseWriter: c.Writer}
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user