-module(aws@internal@codec@compression). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/aws/internal/codec/compression.gleam"). -export([gzip/1, maybe_compress/3]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " Request-body compression for `@smithy.api#requestCompression`.\n" "\n" " Mirrors the Rust SDK's `RequestCompressionInterceptor`\n" " (vendor/aws-sdk-rust/sdk/aws-smithy-compression/src/) — gzip the\n" " body when it's at least `min_compression_size_bytes` long, drop\n" " the wrap entirely when it's smaller (compressing tiny bodies\n" " usually makes them larger). The default matches Rust:\n" " 10 240 bytes (10 KiB).\n" "\n" " Erlang's stdlib `zlib:gzip/1` does the work — no extra deps.\n" " Only gzip is supported today; the trait technically allows other\n" " algorithms (brotli, etc.) but no AWS service uses them.\n" ). -file("src/aws/internal/codec/compression.gleam", 28). ?DOC( " Gzip a body via Erlang's `zlib:gzip/1`. Pure function; no\n" " streaming variant since `@requestCompression` only wraps\n" " buffered bodies (streaming bodies use the chunked transport\n" " which has its own per-chunk wrappers).\n" ). -spec gzip(bitstring()) -> bitstring(). gzip(Body) -> zlib:gzip(Body). -file("src/aws/internal/codec/compression.gleam", 37). ?DOC( " Apply a `@requestCompression` algorithm to `body` if the body is\n" " at least `min_size` bytes long. Returns `#(compressed_body,\n" " applied)` — `applied` is `True` iff the body was actually wrapped\n" " (the caller uses it to decide whether to set the\n" " `Content-Encoding` header). When `encoding` isn't `\"gzip\"` (the\n" " only algorithm we support today), the body passes through\n" " unchanged and `applied` is `False`.\n" ). -spec maybe_compress(bitstring(), binary(), integer()) -> {bitstring(), boolean()}. maybe_compress(Body, Encoding, Min_size) -> case {Encoding, erlang:byte_size(Body) >= Min_size} of {<<"gzip"/utf8>>, true} -> {zlib:gzip(Body), true}; {_, _} -> {Body, false} end.