Skip to main content

src/codec/livery_codec_gzip.erl

-module(livery_codec_gzip).
-moduledoc """
Built-in `gzip` content-coding over OTP `zlib`.

Emits RFC 1952 gzip framing (zlib WindowBits 31): one valid gzip member
with the header written once and the CRC/ISIZE trailer at finish, so the
streamed output decodes in any conformant client.
""".
-behaviour(livery_codec).

-export([name/0, compress/1, stream_init/0, stream_update/2, stream_finish/1, stream_close/1]).

-define(WINDOW_BITS, 31).

-doc "Content-Encoding token.".
-spec name() -> binary().
name() -> <<"gzip">>.

-doc "One-shot gzip of a whole body.".
-spec compress(iodata()) -> iodata().
compress(Data) -> zlib:gzip(Data).

-doc "Open a streaming gzip context.".
-spec stream_init() -> zlib:zstream().
stream_init() -> livery_codec_zlib:stream_init(?WINDOW_BITS).

-doc "Compress and flush one chunk.".
-spec stream_update(zlib:zstream(), iodata()) -> iodata().
stream_update(Z, Data) -> livery_codec_zlib:stream_update(Z, Data).

-doc "Trailing bytes finalizing the gzip member.".
-spec stream_finish(zlib:zstream()) -> iodata().
stream_finish(Z) -> livery_codec_zlib:stream_finish(Z).

-doc "Release the streaming context.".
-spec stream_close(zlib:zstream()) -> ok.
stream_close(Z) -> livery_codec_zlib:stream_close(Z).