@@ -40,9 +40,16 @@ pub fn compress(data []u8) ?[]u8 {
4040 return result
4141}
4242
43+ [params]
44+ pub struct DecompressParams {
45+ verify_header_checksum bool = true
46+ verify_length bool = true
47+ verify_checksum bool = true
48+ }
49+
4350// decompresses an array of bytes using zlib and returns the decompressed bytes in a new array
4451// Example: decompressed := gzip.decompress(b)?
45- pub fn decompress (data []u8 ) ? []u8 {
52+ pub fn decompress (data []u8 , params DecompressParams ) ? []u8 {
4653 if data.len < 18 {
4754 return error ('data is too short, not gzip compressed?' )
4855 } else if data[0 ] != 0x1f || data[1 ] != 0x8b {
@@ -91,7 +98,7 @@ pub fn decompress(data []u8) ?[]u8 {
9198 checksum_header := crc32 .sum (data[..header_length])
9299 checksum_header_expected := (u32 (data[header_length]) << 24 ) | (u32 (data[header_length + 1 ]) << 16 ) | (u32 (data[
93100 header_length + 2 ]) << 8 ) | data[header_length + 3 ]
94- if checksum_header != checksum_header_expected {
101+ if params.verify_header_checksum && checksum_header != checksum_header_expected {
95102 return error ('header checksum verification failed' )
96103 }
97104 header_length + = 4
@@ -102,12 +109,12 @@ pub fn decompress(data []u8) ?[]u8 {
102109
103110 decompressed := compress.decompress (data[header_length..data.len - 8 ], 0 )?
104111 length_expected := (u32 (data[data.len - 4 ]) << 24 ) | (u32 (data[data.len - 3 ]) << 16 ) | (u32 (data[data.len - 2 ]) << 8 ) | data[data.len - 1 ]
105- if decompressed.len != length_expected {
112+ if params.verify_length && decompressed.len != length_expected {
106113 return error ('length verification failed, got $decompressed.len , expected $length_expected ' )
107114 }
108115 checksum := crc32 .sum (decompressed)
109116 checksum_expected := (u32 (data[data.len - 8 ]) << 24 ) | (u32 (data[data.len - 7 ]) << 16 ) | (u32 (data[data.len - 6 ]) << 8 ) | data[data.len - 5 ]
110- if checksum != checksum_expected {
117+ if params.verify_checksum && checksum != checksum_expected {
111118 return error ('checksum verification failed' )
112119 }
113120 return decompressed
0 commit comments