@@ -22,16 +22,29 @@ import (
2222)
2323
2424type MultiChannelFactory func (underlay Underlay , closeCallback func ()) (MultiChannel , error )
25+ type UngroupedChannelFallback func (underlay Underlay ) error
2526
2627type 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
3234func (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}
0 commit comments