0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 12:20:24 +00:00

Use cow_deflate in cowboy_decompress_h

The function inflate/3 was moved there to make it
usable from within Cowlib itself.
This commit is contained in:
Loïc Hoguin 2025-01-22 11:52:27 +01:00
parent 9d385fa909
commit e00131824a
No known key found for this signature in database
GPG key ID: 8A9DF795F6FED764

View file

@ -68,7 +68,8 @@ data(StreamID, IsFin, Data, State=#state{next=Next0, enabled=false, read_body_bu
fold(Commands, State#state{next=Next, read_body_is_fin=IsFin});
data(StreamID, IsFin, Data, State0=#state{next=Next0, ratio_limit=RatioLimit,
inflate=Z, is_reading=true, read_body_buffer=Buffer}) ->
case inflate(Z, RatioLimit, buffer_to_iovec([Data|Buffer])) of
Limit = iolist_size(Data) * RatioLimit,
case cow_deflate:inflate(Z, buffer_to_iovec([Data|Buffer]), Limit) of
{error, ErrorType} ->
zlib:close(Z),
Status = case ErrorType of
@ -236,22 +237,3 @@ do_build_accept_encoding([{ContentCoding, Q}|Tail], Acc0) ->
do_build_accept_encoding(Tail, Acc);
do_build_accept_encoding([], Acc) ->
Acc.
inflate(Z, RatioLimit, Data) ->
try
{Status, Output} = zlib:safeInflate(Z, Data),
Size = iolist_size(Output),
do_inflate(Z, Size, iolist_size(Data) * RatioLimit, Status, [Output])
catch
error:data_error ->
{error, data_error}
end.
do_inflate(_, Size, Limit, _, _) when Size > Limit ->
{error, size_error};
do_inflate(Z, Size0, Limit, continue, Acc) ->
{Status, Output} = zlib:safeInflate(Z, []),
Size = Size0 + iolist_size(Output),
do_inflate(Z, Size, Limit, Status, [Output | Acc]);
do_inflate(_, _, _, finished, Acc) ->
{ok, iolist_to_binary(lists:reverse(Acc))}.