Packages

Encoding and decoding utilities

Current section

Files

Jump to
encoding_utils src content_encoding.erl
Raw

src/content_encoding.erl

-module(content_encoding).
%% API
-export([
decode/2,
encode/2
]).
decode(undefined, Content) -> Content;
decode(StringEncoding, Content) when is_list(StringEncoding) -> decode(list_to_binary(StringEncoding), Content);
decode(<<"gzip">>, Content) -> zlib:gunzip(Content);
decode(<<"identity">>, Content) -> Content;
decode(<<"deflate">>, Content) -> inflate(Content).
encode(undefined, Content) ->
choose_encoding_and_encode([], Content);
encode(EncodingList, Content) when is_list(EncodingList) ->
encode(list_to_binary(EncodingList), Content);
encode(EncodingList, Content) when is_binary(EncodingList) ->
choose_encoding_and_encode(binary:split(EncodingList, [<<",">>, <<" ">>], [trim, global]), Content).
choose_encoding_and_encode([], Content) -> {Content, undefined};
choose_encoding_and_encode(_Encoding, <<>> = Content) -> {Content, undefined};
choose_encoding_and_encode([<<"gzip">> | _], Content) -> {zlib:gzip(Content), <<"gzip">>};
choose_encoding_and_encode([<<"identity">> | _], Content) -> {Content, undefined};
choose_encoding_and_encode([<<"deflate">> | _], Content) -> {deflate(Content), <<"deflate">>};
choose_encoding_and_encode([_ | Others], Content) -> choose_encoding_and_encode(Others, Content).
%%%-------------------------------------------------------------------
%%% Private
%%%-------------------------------------------------------------------
deflate(Data) ->
Z = zlib:open(),
ok = zlib:deflateInit(Z),
Encoded = zlib:deflate(Z, Data),
Last = zlib:deflate(Z, [], finish),
ok = zlib:deflateEnd(Z),
iolist_to_binary([Encoded | Last]).
inflate(Data) ->
Z = zlib:open(),
ok = zlib:inflateInit(Z),
Decoded = zlib:inflate(Z, Data),
ok = zlib:inflateEnd(Z),
iolist_to_binary(Decoded).