@@ -2069,16 +2069,20 @@ func (f *framer) writeBytesMap(m map[string][]byte) {
20692069}
20702070
20712071func (f * framer ) prepareModernLayout () error {
2072+ // Ensure protocol version is V5 or higher
20722073 if f .proto < protoVersion5 {
20732074 panic ("Modern layout is not supported with version V4 or less" )
20742075 }
20752076
20762077 selfContained := true
20772078
2078- var adjustedBuf []byte
2079- var tempBuf []byte
2080- var err error
2079+ var (
2080+ adjustedBuf []byte
2081+ tempBuf []byte
2082+ err error
2083+ )
20812084
2085+ // Process the buffer in chunks if it exceeds the max payload size
20822086 for len (f .buf ) > maxPayloadSize {
20832087 if f .compres != nil {
20842088 tempBuf , err = newCompressedFrame (f .buf [:maxPayloadSize ], false , f .compres )
@@ -2094,6 +2098,7 @@ func (f *framer) prepareModernLayout() error {
20942098 selfContained = false
20952099 }
20962100
2101+ // Process the remaining buffer
20972102 if f .compres != nil {
20982103 tempBuf , err = newCompressedFrame (f .buf , selfContained , f .compres )
20992104 } else {
@@ -2113,11 +2118,12 @@ func readUncompressedFrame(r io.Reader) ([]byte, bool, error) {
21132118 const headerSize = 6
21142119 header := [headerSize + 1 ]byte {}
21152120
2116- _ , err := io . ReadFull ( r , header [: headerSize ])
2117- if err != nil {
2121+ // Read the frame header
2122+ if _ , err := io . ReadFull ( r , header [: headerSize ]); err != nil {
21182123 return nil , false , fmt .Errorf ("gocql: failed to read uncompressed frame, err: %w" , err )
21192124 }
21202125
2126+ // Compute and verify the header CRC24
21212127 computedHeaderCRC24 := KoopmanChecksum (header [:3 ])
21222128 readHeaderCRC24 := binary .LittleEndian .Uint32 (header [3 :]) & 0xFFFFFF
21232129 if computedHeaderCRC24 != readHeaderCRC24 {
@@ -2129,15 +2135,14 @@ func readUncompressedFrame(r io.Reader) ([]byte, bool, error) {
21292135 payloadLen := int (headerInt & 0x1FFFF )
21302136 isSelfContained := (headerInt & (1 << 17 )) != 0
21312137
2138+ // Read the payload
21322139 payload := make ([]byte , payloadLen )
2133- _ , err = io .ReadFull (r , payload )
2134- if err != nil {
2140+ if _ , err := io .ReadFull (r , payload ); err != nil {
21352141 return nil , false , fmt .Errorf ("gocql: failed to read uncompressed frame payload, err: %w" , err )
21362142 }
21372143
2138- // reading payload crc32
2139- _ , err = io .ReadFull (r , header [:4 ])
2140- if err != nil {
2144+ // Read and verify the payload CRC32
2145+ if _ , err := io .ReadFull (r , header [:4 ]); err != nil {
21412146 return nil , false , fmt .Errorf ("gocql: failed to read payload crc32, err: %w" , err )
21422147 }
21432148
@@ -2160,10 +2165,9 @@ func newUncompressedFrame(payload []byte, isSelfContained bool) ([]byte, error)
21602165
21612166 payloadLen := len (payload )
21622167 if payloadLen > maxPayloadSize {
2163- return nil , fmt .Errorf ("payload length (%d) excides maximum size of 128 KiB" , payloadLen )
2168+ return nil , fmt .Errorf ("payload length (%d) exceeds maximum size of 128 KiB" , payloadLen )
21642169 }
21652170
2166- // Create the header
21672171 header := make ([]byte , headerSize )
21682172
21692173 // First 3 bytes: payload length and self-contained flag
@@ -2188,8 +2192,8 @@ func newUncompressedFrame(payload []byte, isSelfContained bool) ([]byte, error)
21882192 // Create the frame
21892193 frameSize := headerSize + payloadLen + 4 // 4 bytes for CRC32
21902194 frame := make ([]byte , frameSize )
2191- copy (frame , header )
2192- copy (frame [headerSize :], payload )
2195+ copy (frame , header ) // Copy the header to the frame
2196+ copy (frame [headerSize :], payload ) // Copy the payload to the frame
21932197
21942198 // Calculate CRC32 for the payload
21952199 payloadCRC32 := Checksum (payload )
@@ -2203,106 +2207,100 @@ func newCompressedFrame(uncompressedPayload []byte, isSelfContained bool, compre
22032207 if err != nil {
22042208 return nil , err
22052209 }
2206- // skipping first 4 bytes because size of uncompressed payload now is written in frame header,
2207- // not in the body of compressed envelope
2210+
2211+ // Skip the first 4 bytes because the size of the uncompressed payload is written in the frame header, not in the
2212+ // body of the compressed envelope
22082213 compressedPayload = compressedPayload [4 :]
22092214
22102215 compressedLen := len (compressedPayload )
22112216 uncompressedLen := len (uncompressedPayload )
22122217
22132218 if compressedLen > maxPayloadSize {
2214- return nil , fmt .Errorf ("compressed payload length exceedes max size of frame payload %d/%d" , compressedLen , maxPayloadSize )
2219+ return nil , fmt .Errorf ("compressed payload length exceeds max size of frame payload %d/%d" , compressedLen , maxPayloadSize )
22152220 }
22162221
22172222 if uncompressedLen > maxPayloadSize {
2218- return nil , fmt .Errorf ("uncompressed compressed payload length exceedes max size of frame payload %d/%d" , uncompressedLen , maxPayloadSize )
2223+ return nil , fmt .Errorf ("uncompressed payload length exceeds max size of frame payload %d/%d" , uncompressedLen , maxPayloadSize )
22192224 }
22202225
2226+ // Combine compressed and uncompressed lengths and set the self-contained flag if needed
22212227 combined := uint64 (compressedLen ) | uint64 (uncompressedLen )<< 17
22222228 if isSelfContained {
22232229 combined |= 1 << 34
22242230 }
22252231
22262232 var headerBuf [8 ]byte
22272233
2234+ // Write the combined value into the header buffer
22282235 binary .LittleEndian .PutUint64 (headerBuf [:], combined )
22292236
2230- // 8 - size of header, 4 - size of crc32 for payload
2237+ // Create a buffer with enough capacity to hold the header, compressed payload, and checksums
22312238 buf := bytes .NewBuffer (make ([]byte , 0 , 8 + compressedLen + 4 ))
22322239
2233- // writing compressed and uncompressed sizes
2240+ // Write the first 5 bytes of the header ( compressed and uncompressed sizes)
22342241 buf .Write (headerBuf [:5 ])
22352242
2236- // writing crc24 of first 5 bytes
2243+ // Compute and write the CRC24 checksum of the first 5 bytes
22372244 headerChecksum := KoopmanChecksum (headerBuf [:5 ])
22382245 binary .LittleEndian .PutUint32 (headerBuf [:], headerChecksum )
22392246 buf .Write (headerBuf [:3 ])
2240-
2241- // writing compressed payload
22422247 buf .Write (compressedPayload )
22432248
2244- // writing checksum of payload
2249+ // Compute and write the CRC32 checksum of the payload
22452250 payloadChecksum := Checksum (compressedPayload )
22462251 binary .LittleEndian .PutUint32 (headerBuf [:], payloadChecksum )
22472252 buf .Write (headerBuf [:4 ])
22482253
2249- return buf .Bytes (), err
2254+ return buf .Bytes (), nil
22502255}
22512256
22522257func readCompressedFrame (r io.Reader , compressor Compressor ) ([]byte , bool , error ) {
2253- var headerBuf [8 ]byte
2254- _ , err := io .ReadFull (r , headerBuf [:])
2255- if err != nil {
2258+ var (
2259+ headerBuf [8 ]byte
2260+ err error
2261+ )
2262+
2263+ if _ , err = io .ReadFull (r , headerBuf [:]); err != nil {
22562264 return nil , false , err
22572265 }
22582266
2259- // reading checksum from frame header
2267+ // Reading checksum from frame header
22602268 readHeaderChecksum := uint32 (headerBuf [5 ]) | uint32 (headerBuf [6 ])<< 8 | uint32 (headerBuf [7 ])<< 16
2261- computedHeaderChecksum := KoopmanChecksum (headerBuf [:5 ])
2262- if computedHeaderChecksum != readHeaderChecksum {
2269+ if computedHeaderChecksum := KoopmanChecksum (headerBuf [:5 ]); computedHeaderChecksum != readHeaderChecksum {
22632270 return nil , false , fmt .Errorf ("gocql: crc24 mismatch in frame header, read: %d, computed: %d" , readHeaderChecksum , computedHeaderChecksum )
22642271 }
22652272
2266- // first 17 bits - payload size after compression
2267- compressedLen := uint32 (headerBuf [0 ]) |
2268- uint32 (headerBuf [1 ])<< 8 |
2269- uint32 (headerBuf [2 ]& 0x1 )<< 16
2273+ // First 17 bits - payload size after compression
2274+ compressedLen := uint32 (headerBuf [0 ]) | uint32 (headerBuf [1 ])<< 8 | uint32 (headerBuf [2 ]& 0x1 )<< 16
22702275
2271- // the next 17 bits - payload size before compression
2272- uncompressedLen := (uint32 (headerBuf [2 ]) >> 1 ) |
2273- uint32 (headerBuf [3 ])<< 7 |
2274- uint32 (headerBuf [4 ]& 0b11 )<< 15
2276+ // The next 17 bits - payload size before compression
2277+ uncompressedLen := (uint32 (headerBuf [2 ]) >> 1 ) | uint32 (headerBuf [3 ])<< 7 | uint32 (headerBuf [4 ]& 0b11 )<< 15
22752278
2276- // self -contained flag
2279+ // Self -contained flag
22772280 selfContained := (headerBuf [4 ] & 0b100 ) != 0
22782281
22792282 compressedPayload := make ([]byte , compressedLen )
2280- _ , err = io .ReadFull (r , compressedPayload )
2281- if err != nil {
2283+ if _ , err = io .ReadFull (r , compressedPayload ); err != nil {
22822284 return nil , false , err
22832285 }
22842286
2285- _ , err = io .ReadFull (r , headerBuf [:4 ])
2286- if err != nil {
2287+ if _ , err = io .ReadFull (r , headerBuf [:4 ]); err != nil {
22872288 return nil , false , err
22882289 }
22892290
2290- // ensuring if payload checksum matches
2291+ // Ensuring if payload checksum matches
22912292 readPayloadChecksum := binary .LittleEndian .Uint32 (headerBuf [:4 ])
2292- computedPayloadChecksum := Checksum (compressedPayload )
2293- if readPayloadChecksum != computedPayloadChecksum {
2293+ if computedPayloadChecksum := Checksum (compressedPayload ); readPayloadChecksum != computedPayloadChecksum {
22942294 return nil , false , fmt .Errorf ("gocql: crc32 mismatch in payload, read: %d, computed: %d" , readPayloadChecksum , computedPayloadChecksum )
22952295 }
22962296
22972297 var uncompressedPayload []byte
22982298 if uncompressedLen > 0 {
2299- uncompressedPayload , err = compressor .DecodeSized (compressedPayload , uncompressedLen )
2300- if err != nil {
2299+ if uncompressedPayload , err = compressor .DecodeSized (compressedPayload , uncompressedLen ); err != nil {
23012300 return nil , false , err
23022301 }
2303-
23042302 if uint32 (len (uncompressedPayload )) != uncompressedLen {
2305- return nil , false , fmt .Errorf ("gocql: length mismatch after payload decompression, got %d, read %d" , len (uncompressedPayload ), uncompressedLen )
2303+ return nil , false , fmt .Errorf ("gocql: length mismatch after payload decompression, got %d, expected %d" , len (uncompressedPayload ), uncompressedLen )
23062304 }
23072305 } else {
23082306 uncompressedPayload = compressedPayload
0 commit comments