fix race condition for sniffing

This commit is contained in:
ginuerzh
2024-10-20 19:19:16 +08:00
parent 41f527aa46
commit 3ca253537b
4 changed files with 56 additions and 64 deletions
+6 -8
View File
@@ -681,7 +681,7 @@ func (h *httpHandler) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -700,14 +700,13 @@ func (h *httpHandler) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
err := h.copyWebsocketFrame(cc, rw, buf, "client", ro) err := h.copyWebsocketFrame(cc, rw, buf, "client", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, h.recorder.Recorder); err != nil { if err := ro.Record(ctx, h.recorder.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
@@ -721,7 +720,7 @@ func (h *httpHandler) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -740,14 +739,13 @@ func (h *httpHandler) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
err := h.copyWebsocketFrame(rw, cc, buf, "server", ro) err := h.copyWebsocketFrame(rw, cc, buf, "server", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, h.recorder.Recorder); err != nil { if err := ro.Record(ctx, h.recorder.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
+6 -8
View File
@@ -421,7 +421,7 @@ func (ep *entrypoint) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -440,14 +440,13 @@ func (ep *entrypoint) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
err := ep.copyWebsocketFrame(cc, rw, buf, "client", ro) err := ep.copyWebsocketFrame(cc, rw, buf, "client", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, ep.recorder.Recorder); err != nil { if err := ro.Record(ctx, ep.recorder.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
@@ -461,7 +460,7 @@ func (ep *entrypoint) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -480,14 +479,13 @@ func (ep *entrypoint) sniffingWebsocketFrame(ctx context.Context, rw, cc io.Read
err := ep.copyWebsocketFrame(rw, cc, buf, "server", ro) err := ep.copyWebsocketFrame(rw, cc, buf, "server", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, ep.recorder.Recorder); err != nil { if err := ro.Record(ctx, ep.recorder.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
+6 -8
View File
@@ -565,7 +565,7 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -584,14 +584,13 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
err := h.copyWebsocketFrame(cc, rw, buf, "client", ro) err := h.copyWebsocketFrame(cc, rw, buf, "client", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, h.Recorder); err != nil { if err := ro.Record(ctx, h.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
@@ -605,7 +604,7 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -624,14 +623,13 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
err := h.copyWebsocketFrame(rw, cc, buf, "server", ro) err := h.copyWebsocketFrame(rw, cc, buf, "server", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, h.Recorder); err != nil { if err := ro.Record(ctx, h.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
+6 -8
View File
@@ -428,7 +428,7 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -447,14 +447,13 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
err := h.copyWebsocketFrame(cc, rw, buf, "client", ro) err := h.copyWebsocketFrame(cc, rw, buf, "client", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, h.Recorder); err != nil { if err := ro.Record(ctx, h.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }
@@ -468,7 +467,7 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
go func() { go func() {
ro2 := &xrecorder.HandlerRecorderObject{} ro2 := &xrecorder.HandlerRecorderObject{}
*ro2 = *ro *ro2 = *ro
ro = ro2 ro := ro2
ticker := &time.Ticker{} ticker := &time.Ticker{}
if d > 0 { if d > 0 {
@@ -487,14 +486,13 @@ func (h *Sniffer) sniffingWebsocketFrame(ctx context.Context, rw, cc io.ReadWrit
err := h.copyWebsocketFrame(rw, cc, buf, "server", ro) err := h.copyWebsocketFrame(rw, cc, buf, "server", ro)
select { select {
case <-ticker.C: case <-ticker.C:
if err != nil { if err == nil {
ro.Err = err.Error()
}
ro.Duration = time.Since(start) ro.Duration = time.Since(start)
ro.Time = time.Now() ro.Time = time.Now()
if err := ro.Record(ctx, h.Recorder); err != nil { if err := ro.Record(ctx, h.Recorder); err != nil {
log.Errorf("record: %v", err) log.Errorf("record: %v", err)
} }
}
default: default:
} }