Skip to content

Commit 92cc53c

Browse files
authored
Merge pull request #188 from openziti/mc-listener-fallback
Allow fallback to regular channel when 'is grouped' isn't set when using multi-listener. Fixes #187
2 parents eaf2b68 + 5dbd61a commit 92cc53c

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

multi_listener.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,29 @@ import (
2222
)
2323

2424
type MultiChannelFactory func(underlay Underlay, closeCallback func()) (MultiChannel, error)
25+
type UngroupedChannelFallback func(underlay Underlay) error
2526

2627
type MultiListener struct {
27-
channels map[string]MultiChannel
28-
lock sync.Mutex
29-
channelFactory MultiChannelFactory
28+
channels map[string]MultiChannel
29+
lock sync.Mutex
30+
multiChannelFactory MultiChannelFactory
31+
ungroupedChannelFallback UngroupedChannelFallback
3032
}
3133

3234
func (self *MultiListener) AcceptUnderlay(underlay Underlay) {
33-
log := pfxlog.Logger().WithField("underlayId", underlay.ConnectionId()).
34-
WithField("underlayType", GetUnderlayType(underlay))
35+
isGrouped, _ := Headers(underlay.Headers()).GetBoolHeader(IsGroupedHeader)
36+
37+
log := pfxlog.Logger().
38+
WithField("underlayId", underlay.ConnectionId()).
39+
WithField("underlayType", GetUnderlayType(underlay)).
40+
WithField("isGrouped", isGrouped)
41+
42+
if !isGrouped {
43+
if err := self.ungroupedChannelFallback(underlay); err != nil {
44+
log.WithError(err).Errorf("failed to create channel")
45+
}
46+
return
47+
}
3548

3649
chId := underlay.ConnectionId()
3750

@@ -47,13 +60,13 @@ func (self *MultiListener) AcceptUnderlay(underlay Underlay) {
4760
} else {
4861
log.Info("no existing channel found for underlay")
4962
var err error
50-
mc, err = self.channelFactory(underlay, func() {
63+
mc, err = self.multiChannelFactory(underlay, func() {
5164
self.CloseChannel(chId)
5265
})
5366

5467
if mc != nil {
5568
if err != nil {
56-
pfxlog.Logger().WithError(err).Errorf("failed to create multi-underlay channel")
69+
log.WithError(err).Errorf("failed to create multi-underlay channel")
5770
} else {
5871
self.lock.Lock()
5972
self.channels[chId] = mc
@@ -69,10 +82,11 @@ func (self *MultiListener) CloseChannel(chId string) {
6982
self.lock.Unlock()
7083
}
7184

72-
func NewMultiListener(channelF MultiChannelFactory) *MultiListener {
85+
func NewMultiListener(channelF MultiChannelFactory, fallback UngroupedChannelFallback) *MultiListener {
7386
result := &MultiListener{
74-
channels: make(map[string]MultiChannel),
75-
channelFactory: channelF,
87+
channels: make(map[string]MultiChannel),
88+
multiChannelFactory: channelF,
89+
ungroupedChannelFallback: fallback,
7690
}
7791
return result
7892
}

multi_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package channel
1818

1919
import (
20+
"errors"
2021
"fmt"
2122
"github.com/michaelquigley/pfxlog"
2223
"github.com/openziti/foundation/v2/goroutines"
@@ -112,6 +113,8 @@ func Test_MultiUnderlayChannels(t *testing.T) {
112113
}
113114
underlayHandler := NewListenerPriorityChannel(wrapper)
114115
return newMultiChannel("listener", underlayHandler, wrapper, closeCallback)
116+
}, func(underlay Underlay) error {
117+
return errors.New("this implementation only accepts grouped channel")
115118
})
116119

117120
listenerConfig := ListenerConfig{

0 commit comments

Comments
 (0)