11package sarama
22
3- // ApiVersionsResponseBlock is an api version response block type
4- type ApiVersionsResponseBlock struct {
5- ApiKey int16
3+ // ApiVersionsResponseKey contains the APIs supported by the broker.
4+ type ApiVersionsResponseKey struct {
5+ // Version defines the protocol version to use for encode and decode
6+ Version int16
7+ // ApiKey contains the API index.
8+ ApiKey int16
9+ // MinVersion contains the minimum supported version, inclusive.
610 MinVersion int16
11+ // MaxVersion contains the maximum supported version, inclusive.
712 MaxVersion int16
813}
914
10- func (b * ApiVersionsResponseBlock ) encode (pe packetEncoder ) error {
11- pe .putInt16 (b .ApiKey )
12- pe .putInt16 (b .MinVersion )
13- pe .putInt16 (b .MaxVersion )
15+ func (a * ApiVersionsResponseKey ) encode (pe packetEncoder , version int16 ) (err error ) {
16+ a .Version = version
17+ pe .putInt16 (a .ApiKey )
18+
19+ pe .putInt16 (a .MinVersion )
20+
21+ pe .putInt16 (a .MaxVersion )
22+
23+ if version >= 3 {
24+ pe .putEmptyTaggedFieldArray ()
25+ }
26+
1427 return nil
1528}
1629
17- func (b * ApiVersionsResponseBlock ) decode (pd packetDecoder ) error {
18- var err error
19-
20- if b .ApiKey , err = pd .getInt16 (); err != nil {
30+ func (a * ApiVersionsResponseKey ) decode (pd packetDecoder , version int16 ) (err error ) {
31+ a .Version = version
32+ if a .ApiKey , err = pd .getInt16 (); err != nil {
2133 return err
2234 }
2335
24- if b .MinVersion , err = pd .getInt16 (); err != nil {
36+ if a .MinVersion , err = pd .getInt16 (); err != nil {
2537 return err
2638 }
2739
28- if b .MaxVersion , err = pd .getInt16 (); err != nil {
40+ if a .MaxVersion , err = pd .getInt16 (); err != nil {
2941 return err
3042 }
3143
44+ if version >= 3 {
45+ if _ , err := pd .getEmptyTaggedFieldArray (); err != nil {
46+ return err
47+ }
48+ }
49+
3250 return nil
3351}
3452
35- // ApiVersionsResponse is an api version response type
3653type ApiVersionsResponse struct {
37- Err KError
38- ApiVersions []* ApiVersionsResponseBlock
54+ // Version defines the protocol version to use for encode and decode
55+ Version int16
56+ // ErrorCode contains the top-level error code.
57+ ErrorCode int16
58+ // ApiKeys contains the APIs supported by the broker.
59+ ApiKeys []ApiVersionsResponseKey
60+ // ThrottleTimeMs contains the duration in milliseconds for which the request was throttled due to a quota violation, or zero if the request did not violate any quota.
61+ ThrottleTimeMs int32
3962}
4063
41- func (r * ApiVersionsResponse ) encode (pe packetEncoder ) error {
42- pe .putInt16 (int16 (r .Err ))
43- if err := pe .putArrayLength (len (r .ApiVersions )); err != nil {
44- return err
64+ func (r * ApiVersionsResponse ) encode (pe packetEncoder ) (err error ) {
65+ pe .putInt16 (r .ErrorCode )
66+
67+ if r .Version >= 3 {
68+ pe .putCompactArrayLength (len (r .ApiKeys ))
69+ } else {
70+ if err := pe .putArrayLength (len (r .ApiKeys )); err != nil {
71+ return err
72+ }
4573 }
46- for _ , apiVersion := range r .ApiVersions {
47- if err := apiVersion .encode (pe ); err != nil {
74+ for _ , block := range r .ApiKeys {
75+ if err := block .encode (pe , r . Version ); err != nil {
4876 return err
4977 }
5078 }
79+
80+ if r .Version >= 1 {
81+ pe .putInt32 (r .ThrottleTimeMs )
82+ }
83+
84+ if r .Version >= 3 {
85+ pe .putEmptyTaggedFieldArray ()
86+ }
87+
5188 return nil
5289}
5390
54- func (r * ApiVersionsResponse ) decode (pd packetDecoder , version int16 ) error {
55- kerr , err := pd . getInt16 ()
56- if err != nil {
91+ func (r * ApiVersionsResponse ) decode (pd packetDecoder , version int16 ) ( err error ) {
92+ r . Version = version
93+ if r . ErrorCode , err = pd . getInt16 (); err != nil {
5794 return err
5895 }
5996
60- r .Err = KError (kerr )
97+ var numApiKeys int
98+ if r .Version >= 3 {
99+ numApiKeys , err = pd .getCompactArrayLength ()
100+ if err != nil {
101+ return err
102+ }
103+ } else {
104+ numApiKeys , err = pd .getArrayLength ()
105+ if err != nil {
106+ return err
107+ }
108+ }
109+ r .ApiKeys = make ([]ApiVersionsResponseKey , numApiKeys )
110+ for i := 0 ; i < numApiKeys ; i ++ {
111+ var block ApiVersionsResponseKey
112+ if err = block .decode (pd , r .Version ); err != nil {
113+ return err
114+ }
115+ r .ApiKeys [i ] = block
116+ }
61117
62- numBlocks , err := pd .getArrayLength ()
63- if err != nil {
64- return err
118+ if r .Version >= 1 {
119+ if r .ThrottleTimeMs , err = pd .getInt32 (); err != nil {
120+ return err
121+ }
65122 }
66123
67- r .ApiVersions = make ([]* ApiVersionsResponseBlock , numBlocks )
68- for i := 0 ; i < numBlocks ; i ++ {
69- block := new (ApiVersionsResponseBlock )
70- if err := block .decode (pd ); err != nil {
124+ if r .Version >= 3 {
125+ if _ , err = pd .getEmptyTaggedFieldArray (); err != nil {
71126 return err
72127 }
73- r .ApiVersions [i ] = block
74128 }
75129
76130 return nil
@@ -81,13 +135,22 @@ func (r *ApiVersionsResponse) key() int16 {
81135}
82136
83137func (r * ApiVersionsResponse ) version () int16 {
84- return 0
138+ return r . Version
85139}
86140
87- func (a * ApiVersionsResponse ) headerVersion () int16 {
141+ func (r * ApiVersionsResponse ) headerVersion () int16 {
142+ // ApiVersionsResponse always includes a v0 header.
143+ // See KIP-511 for details
88144 return 0
89145}
90146
91147func (r * ApiVersionsResponse ) requiredVersion () KafkaVersion {
92- return V0_10_0_0
148+ switch r .Version {
149+ case 0 :
150+ return V0_10_0_0
151+ case 3 :
152+ return V2_4_0_0
153+ default :
154+ return V0_10_0_0
155+ }
93156}
0 commit comments