@@ -83,7 +83,7 @@ func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int {
8383 if info != nil {
8484 return int (info .FirstKeyPos )
8585 }
86- return 0
86+ return 1
8787}
8888
8989func cmdString (cmd Cmder , val interface {}) string {
@@ -2649,13 +2649,14 @@ func (cmd *ClusterSlotsCmd) readReply(rd *proto.Reader) error {
26492649
26502650 // subtract start and end.
26512651 nodes := make ([]ClusterNode , n - 2 )
2652+
26522653 for j := 0 ; j < len (nodes ); j ++ {
26532654 nn , err := rd .ReadArrayLen ()
26542655 if err != nil {
26552656 return err
26562657 }
2657- if nn != 2 && nn != 3 {
2658- return fmt .Errorf ("got %d elements in cluster info address, expected 2 or 3 " , nn )
2658+ if nn < 2 || nn > 4 {
2659+ return fmt .Errorf ("got %d elements in cluster info address, expected 2, 3, or 4 " , n )
26592660 }
26602661
26612662 ip , err := rd .ReadString ()
@@ -2670,14 +2671,43 @@ func (cmd *ClusterSlotsCmd) readReply(rd *proto.Reader) error {
26702671
26712672 nodes [j ].Addr = net .JoinHostPort (ip , port )
26722673
2673- if nn = = 3 {
2674+ if nn > = 3 {
26742675 id , err := rd .ReadString ()
26752676 if err != nil {
26762677 return err
26772678 }
26782679 nodes [j ].ID = id
26792680 }
2681+
2682+ if nn >= 4 {
2683+ networkingMetadata := make (map [string ]string )
2684+
2685+ metadataLength , err := rd .ReadArrayLen ()
2686+ if err != nil {
2687+ return err
2688+ }
2689+
2690+ if metadataLength % 2 != 0 {
2691+ return fmt .Errorf (
2692+ "got %d elements in metadata, expected an even number" , metadataLength )
2693+ }
2694+
2695+ for i := 0 ; i < metadataLength ; i += 2 {
2696+ key , err := rd .ReadString ()
2697+ if err != nil {
2698+ return err
2699+ }
2700+ value , err := rd .ReadString ()
2701+ if err != nil {
2702+ return err
2703+ }
2704+ networkingMetadata [key ] = value
2705+ }
2706+
2707+ nodes [j ].NetworkingMetadata = networkingMetadata
2708+ }
26802709 }
2710+
26812711 cmd .val [i ] = ClusterSlot {
26822712 Start : int (start ),
26832713 End : int (end ),
@@ -3136,6 +3166,7 @@ func (cmd *CommandsInfoCmd) String() string {
31363166func (cmd * CommandsInfoCmd ) readReply (rd * proto.Reader ) error {
31373167 const numArgRedis5 = 6
31383168 const numArgRedis6 = 7
3169+ const numArgRedis7 = 10
31393170
31403171 n , err := rd .ReadArrayLen ()
31413172 if err != nil {
@@ -3148,8 +3179,12 @@ func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
31483179 if err != nil {
31493180 return err
31503181 }
3151- if nn != numArgRedis5 && nn != numArgRedis6 {
3152- return fmt .Errorf ("redis: got %d elements in COMMAND reply, wanted 6/7" , nn )
3182+
3183+ switch nn {
3184+ case numArgRedis5 , numArgRedis6 , numArgRedis7 :
3185+ // ok
3186+ default :
3187+ return fmt .Errorf ("redis: got %d elements in COMMAND reply, wanted 6/7/10" , nn )
31533188 }
31543189
31553190 cmdInfo := & CommandInfo {}
@@ -3200,7 +3235,7 @@ func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
32003235 }
32013236 cmdInfo .StepCount = int8 (stepCount )
32023237
3203- if nn = = numArgRedis6 {
3238+ if nn > = numArgRedis6 {
32043239 aclFlagLen , err := rd .ReadArrayLen ()
32053240 if err != nil {
32063241 return err
@@ -3218,6 +3253,18 @@ func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
32183253 }
32193254 }
32203255
3256+ if nn >= numArgRedis7 {
3257+ if err := rd .DiscardNext (); err != nil {
3258+ return err
3259+ }
3260+ if err := rd .DiscardNext (); err != nil {
3261+ return err
3262+ }
3263+ if err := rd .DiscardNext (); err != nil {
3264+ return err
3265+ }
3266+ }
3267+
32213268 cmd .val [cmdInfo .Name ] = cmdInfo
32223269 }
32233270
0 commit comments