123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 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
- }
|