@@ -55,6 +55,7 @@ private static readonly Message
5555
5656 private long bytesLastResult ;
5757 private long bytesInBuffer ;
58+ internal long ? ConnectionId { get ; set ; }
5859
5960 internal void GetBytes ( out long sent , out long received )
6061 {
@@ -1581,10 +1582,19 @@ private void MatchResult(in RawResult result)
15811582 // invoke the handlers
15821583 var channel = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Literal ) ;
15831584 Trace ( "MESSAGE: " + channel ) ;
1584- if ( ! channel . IsNull && TryGetPubSubPayload ( items [ 2 ] , out var payload ) )
1585+ if ( ! channel . IsNull )
15851586 {
1586- _readStatus = ReadStatus . InvokePubSub ;
1587- muxer . OnMessage ( channel , channel , payload ) ;
1587+ if ( TryGetPubSubPayload ( items [ 2 ] , out var payload ) )
1588+ {
1589+ _readStatus = ReadStatus . InvokePubSub ;
1590+ muxer . OnMessage ( channel , channel , payload ) ;
1591+ }
1592+ // could be multi-message: https://github.com/StackExchange/StackExchange.Redis/issues/2507
1593+ else if ( TryGetMultiPubSubPayload ( items [ 2 ] , out var payloads ) )
1594+ {
1595+ _readStatus = ReadStatus . InvokePubSub ;
1596+ muxer . OnMessage ( channel , channel , payloads ) ;
1597+ }
15881598 }
15891599 return ; // AND STOP PROCESSING!
15901600 }
@@ -1594,11 +1604,20 @@ private void MatchResult(in RawResult result)
15941604
15951605 var channel = items [ 2 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Literal ) ;
15961606 Trace ( "PMESSAGE: " + channel ) ;
1597- if ( ! channel . IsNull && TryGetPubSubPayload ( items [ 3 ] , out var payload ) )
1607+ if ( ! channel . IsNull )
15981608 {
1599- var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Pattern ) ;
1600- _readStatus = ReadStatus . InvokePubSub ;
1601- muxer . OnMessage ( sub , channel , payload ) ;
1609+ if ( TryGetPubSubPayload ( items [ 3 ] , out var payload ) )
1610+ {
1611+ var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Pattern ) ;
1612+ _readStatus = ReadStatus . InvokePubSub ;
1613+ muxer . OnMessage ( sub , channel , payload ) ;
1614+ }
1615+ else if ( TryGetMultiPubSubPayload ( items [ 3 ] , out var payloads ) )
1616+ {
1617+ var sub = items [ 1 ] . AsRedisChannel ( ChannelPrefix , RedisChannel . PatternMode . Pattern ) ;
1618+ _readStatus = ReadStatus . InvokePubSub ;
1619+ muxer . OnMessage ( sub , channel , payloads ) ;
1620+ }
16021621 }
16031622 return ; // AND STOP PROCESSING!
16041623 }
@@ -1647,6 +1666,17 @@ static bool TryGetPubSubPayload(in RawResult value, out RedisValue parsed, bool
16471666 parsed = default ;
16481667 return false ;
16491668 }
1669+
1670+ static bool TryGetMultiPubSubPayload ( in RawResult value , out Sequence < RawResult > parsed )
1671+ {
1672+ if ( value . Type == ResultType . MultiBulk && value . ItemsCount != 0 )
1673+ {
1674+ parsed = value . GetItems ( ) ;
1675+ return true ;
1676+ }
1677+ parsed = default ;
1678+ return false ;
1679+ }
16501680 }
16511681
16521682 private volatile Message ? _activeMessage ;
0 commit comments