| 1 | // [rfc1952](https://datatracker.ietf.org/doc/html/rfc1952) compliant |
| 2 | // gzip compression/decompression |
| 3 | |
| 4 | module gzip |
| 5 | |
| 6 | import compress.deflate |
| 7 | |
| 8 | // CompressFlags |
| 9 | @[deprecated: 'never used'] |
| 10 | @[deprecated_after: '2026-07-31'] |
| 11 | @[flag] |
| 12 | pub enum CompressFlags { |
| 13 | // The low 12 bits will be overwritten by `compression_level` |
| 14 | compression_level_overwrite_flag01 |
| 15 | compression_level_overwrite_flag02 |
| 16 | compression_level_overwrite_flag03 |
| 17 | compression_level_overwrite_flag04 |
| 18 | compression_level_overwrite_flag05 |
| 19 | compression_level_overwrite_flag06 |
| 20 | compression_level_overwrite_flag07 |
| 21 | compression_level_overwrite_flag08 |
| 22 | compression_level_overwrite_flag09 |
| 23 | compression_level_overwrite_flag10 |
| 24 | compression_level_overwrite_flag11 |
| 25 | compression_level_overwrite_flag12 |
| 26 | write_zlib_header |
| 27 | compute_adler32 |
| 28 | greedy_parsing_flag |
| 29 | nondeterministic_parsing_flag |
| 30 | rle_matches |
| 31 | filter_matches |
| 32 | force_all_static_blocks |
| 33 | force_all_raw_blocks |
| 34 | } |
| 35 | |
| 36 | // CompressParams set compression_level for compression: |
| 37 | @[deprecated: 'never used'] |
| 38 | @[deprecated_after: '2026-07-31'] |
| 39 | @[params] |
| 40 | pub struct CompressParams { |
| 41 | pub: |
| 42 | compression_level int |
| 43 | flags CompressFlags |
| 44 | } |
| 45 | |
| 46 | // compress compresses an array of bytes using gzip and returns the compressed bytes in a new array. |
| 47 | pub fn compress(data []u8) ![]u8 { |
| 48 | // Delegate to deflate.compress_gzip() which implements RFC 1952 |
| 49 | return deflate.compress_gzip(data) |
| 50 | } |
| 51 | |
| 52 | // DecompressFlags |
| 53 | // N.B.: only retained for API compatibility. |
| 54 | @[deprecated: 'never used'] |
| 55 | @[deprecated_after: '2026-07-31'] |
| 56 | @[flag] |
| 57 | pub enum DecompressFlags { |
| 58 | parse_zlib_header |
| 59 | has_more_input |
| 60 | using_non_wrapping_output_buf |
| 61 | compute_adler32 |
| 62 | } |
| 63 | |
| 64 | // DecompressParams controls gzip decompression behavior. |
| 65 | // N.B.: only retained for API compatibility. |
| 66 | @[deprecated: 'never used'] |
| 67 | @[deprecated_after: '2026-07-31'] |
| 68 | @[params] |
| 69 | pub struct DecompressParams { |
| 70 | pub: |
| 71 | verify_header_checksum bool = true |
| 72 | verify_length bool = true |
| 73 | verify_checksum bool = true |
| 74 | flags DecompressFlags |
| 75 | } |
| 76 | |
| 77 | // validate validates the gzip header of data and returns its parsed details if valid. |
| 78 | // N.B.: only retained for API compatibility, all validation is now performed by the deflate backend. |
| 79 | // The returned header details are not used by the decompressor. |
| 80 | // TODO: remove after the deprecation period. |
| 81 | @[deprecated: 'never used'] |
| 82 | @[deprecated_after: '2026-07-31'] |
| 83 | pub fn validate(data []u8, _ DecompressParams) !deflate.GzipHeader { |
| 84 | return deflate.validate_gzip_header(data)! |
| 85 | } |
| 86 | |
| 87 | // decompress decompresses a gzip stream and returns the decompressed bytes in a new array. |
| 88 | pub fn decompress(data []u8) ![]u8 { |
| 89 | return deflate.decompress_gzip(data) |
| 90 | } |
| 91 | |
| 92 | // decompress_with_callback decompresses a gzip stream (RFC 1952) using a callback for chunked delivery. |
| 93 | // The callback receives chunks of decompressed data and should return the chunk length to continue, or 0 to abort. |
| 94 | // Returns the total decompressed length. |
| 95 | pub fn decompress_with_callback(data []u8, cb deflate.ChunkCallback, userdata voidptr) !int { |
| 96 | deflate.validate_gzip_header(data)! |
| 97 | return deflate.decompress_with_callback(data, cb, userdata) |
| 98 | } |
| 99 | |