Skip to content

Commit ff8e286

Browse files
committed
compress.gzip: support gzip.decompress(data, verify_length: false, verify_checksum: false)?
1 parent 5c104cf commit ff8e286

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

vlib/compress/gzip/gzip.v

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)