48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package h2mux
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"golang.org/x/net/http2"
|
|
)
|
|
|
|
// StreamErrorMap is used to track stream errors. This is a separate structure to ActiveStreamMap because
|
|
// errors can be raised against non-existent or closed streams.
|
|
type StreamErrorMap struct {
|
|
sync.RWMutex
|
|
// errors tracks per-stream errors
|
|
errors map[uint32]http2.ErrCode
|
|
// hasError is signaled whenever an error is raised.
|
|
hasError Signal
|
|
}
|
|
|
|
// NewStreamErrorMap creates a new StreamErrorMap.
|
|
func NewStreamErrorMap() *StreamErrorMap {
|
|
return &StreamErrorMap{
|
|
errors: make(map[uint32]http2.ErrCode),
|
|
hasError: NewSignal(),
|
|
}
|
|
}
|
|
|
|
// RaiseError raises a stream error.
|
|
func (s *StreamErrorMap) RaiseError(streamID uint32, err http2.ErrCode) {
|
|
s.Lock()
|
|
s.errors[streamID] = err
|
|
s.Unlock()
|
|
s.hasError.Signal()
|
|
}
|
|
|
|
// GetSignalChan returns a channel that is signalled when an error is raised.
|
|
func (s *StreamErrorMap) GetSignalChan() <-chan struct{} {
|
|
return s.hasError.WaitChannel()
|
|
}
|
|
|
|
// GetErrors retrieves all errors currently raised. This resets the currently-tracked errors.
|
|
func (s *StreamErrorMap) GetErrors() map[uint32]http2.ErrCode {
|
|
s.Lock()
|
|
errors := s.errors
|
|
s.errors = make(map[uint32]http2.ErrCode)
|
|
s.Unlock()
|
|
return errors
|
|
}
|