diff --git a/agents/http3_agent.go b/agents/http3_agent.go index ecdd0b4..59b77ab 100644 --- a/agents/http3_agent.go +++ b/agents/http3_agent.go @@ -251,7 +251,11 @@ func (a *HTTP3Agent) SendRequest(path, method, authority string, headers map[str a.responseBuffer[streamID] = response go func() { // Pipes the data from the response stream to the agent - defer stream.ReadChan.Unregister(streamChan) + defer func() { + if !stream.ReadChan.IsClosed() { + stream.ReadChan.Unregister(streamChan) + } + }() for { select { case i := <-streamChan: diff --git a/utils.go b/utils.go index e3b8e1b..580597f 100644 --- a/utils.go +++ b/utils.go @@ -5,6 +5,7 @@ import "github.com/dustin/go-broadcast" type Broadcaster struct { broadcast.Broadcaster channels []chan interface{} + isClosed bool } func NewBroadcaster(buflen int) Broadcaster { @@ -19,8 +20,15 @@ func (b *Broadcaster) RegisterNewChan(size int) chan interface{} { } func (b *Broadcaster) Close() error { + if b.isClosed { + return nil + } + b.isClosed = true for _, c := range b.channels { close(c) } return b.Broadcaster.Close() +} +func (b *Broadcaster) IsClosed() bool { + return b.isClosed } \ No newline at end of file