Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- **HTTP/3 QPACK header compression** (RFC 9204) behind the new `qpack`
feature. `compcol::qpack::{QpackEncoder, QpackDecoder}` — full decoder
(static table, dynamic table built from the encoder-stream instructions, and
all field-line representations) validated byte-for-byte against the RFC 9204
Appendix B examples; the encoder uses the static table + literals (Required
Insert Count = 0). Reuses the HPACK string Huffman code and `HeaderField`.
- **Standalone primitives / transforms**, each a first-class codec reachable
through the factory:
- `huffman` — a self-delimiting canonical (length-limited, order-0) Huffman
codec, `compcol::huffman_codec::Huffman` (name `"huffman"`).
- `rangecoder` — an adaptive order-0 binary range coder,
`compcol::rangecoder::RangeCoder` (name `"range"`).
- `mtf` — the Move-To-Front reversible transform, `compcol::mtf::Mtf`
(name `"mtf"`), a streaming length-preserving filter.
- `bwt` — a standalone block Burrows-Wheeler Transform, `compcol::bwt::Bwt`
(name `"bwt"`), with a per-block primary index. Pairs with `mtf` + an
entropy coder to build a bzip2-style pipeline from parts.

## [0.6.2](https://github.com/KarpelesLab/compcol/compare/v0.6.1...v0.6.2) - 2026-06-12

### Other
Expand Down
22 changes: 21 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ all = [
"lha",
"bcj", "bcj2", "delta",
"arc_crunch", "arc_squeeze", "arc_squash",
"hpack",
"hpack", "qpack",
"huffman", "rangecoder", "mtf", "bwt",
]
# Enables `alloc`-backed conveniences (e.g. the `factory` module, the
# `compcol::vec` one-shot helpers). Pulled in automatically by features
Expand Down Expand Up @@ -246,6 +247,25 @@ arc_squash = ["alloc"]
# (name `"h2-huffman"`). The full header codec lives behind its own
# `compcol::hpack` API (it is stateful over header lists, not a byte stream).
hpack = ["alloc"]
# HTTP/3 QPACK header compression (RFC 9204): static table (Appendix A),
# dynamic table built from the encoder-stream instructions, and all field-line
# representations. Reuses the HPACK string Huffman code, so it pulls `hpack`.
# Lives behind its own `compcol::qpack` API (stateful header codec, not a byte
# stream). Decoder is full; the encoder uses the static table + literals.
qpack = ["alloc", "hpack"]
# Standalone canonical (length-limited) Huffman codec — `compcol::huffman_codec`
# (name `"huffman"`). Self-delimiting order-0 Huffman over bytes.
huffman = ["alloc"]
# Standalone adaptive order-0 binary range coder — `compcol::rangecoder`
# (name `"range"`). A self-contained entropy codec.
rangecoder = ["alloc"]
# Move-To-Front reversible transform — `compcol::mtf` (name `"mtf"`). A
# length-preserving, streaming byte filter (as used inside bzip2).
mtf = ["alloc"]
# Standalone block Burrows-Wheeler Transform — `compcol::bwt` (name `"bwt"`).
# Reversible block transform with a per-block primary index; pairs with `mtf`
# and an entropy coder.
bwt = ["alloc"]
# `compcol::tokio_io` — async mirrors of compcol::io for the tokio
# runtime. Pulls the tokio dependency for its AsyncRead/AsyncWrite
# trait definitions; the rest of the crate stays dep-free.
Expand Down
20 changes: 14 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,20 @@ flag, and a `compcol` binary turns the library into a Unix-style filter.
| RAR 3.x | `rar3` | `.rar` | `Unsupported` (license) | full LZ77+Huffman + E8 filter; PPMd & VM filters refused | libarchive RAR3 fixtures |
| RAR 5.x | `rar5` | `.rar` | `Unsupported` (license) | full LZ77+Huffman + x86 filter; Delta/ARM refused | RARLAB-CLI fixtures |
| HTTP/2 HPACK (RFC 7541) | `hpack` | — | full (header codec + `h2-huffman` string codec) | full (static+dynamic tables, integer/string coding) | RFC 7541 Appendix C vectors |

HPACK is HTTP/2's header-compression codec, not a byte-stream codec: it
operates on `(name, value)` header lists with per-connection dynamic-table
state, so it lives behind its own `compcol::hpack` API (`HpackEncoder` /
`HpackDecoder`). The §5.2 string Huffman primitive is also exposed as the
`Http2Huffman` codec (name `h2-huffman`) through the uniform trait surface.
| HTTP/3 QPACK (RFC 9204) | `qpack` | — | static-table + literal encoder; full decoder | full (static+dynamic tables via encoder stream, all field representations) | RFC 9204 Appendix B vectors |
| Canonical Huffman (standalone) | `huffman` | `.huff` | full (length-limited, self-delimiting) | full | own round-trip |
| Range coder (adaptive order-0) | `rangecoder` | `.range` | full | full | own round-trip |
| Move-To-Front transform | `mtf` | `mtf` | full (reversible filter) | full | round-trip identity |
| Burrows-Wheeler Transform (standalone) | `bwt` | `bwt` | full (block BWT + primary index) | full | round-trip identity |

HPACK and QPACK are HTTP header-compression codecs, not byte-stream codecs:
they operate on `(name, value)` header lists with per-connection dynamic-table
state, so they live behind their own `compcol::hpack` / `compcol::qpack` APIs.
The §5.2 string Huffman primitive is also exposed as the `Http2Huffman` codec
(name `h2-huffman`) through the uniform trait surface; QPACK reuses it. The
`huffman` / `rangecoder` / `mtf` / `bwt` features expose standalone
building-block codecs (entropy coding and reversible transforms) that can be
composed into a custom pipeline.

The RAR encoders are permanently `Unsupported` per RARLAB's unRAR
license terms (every clean-room RAR reader — libarchive, The
Expand Down
Loading
Loading