aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cowboy_decompress_h.erl25
1 files changed, 4 insertions, 21 deletions
diff --git a/src/cowboy_decompress_h.erl b/src/cowboy_decompress_h.erl
index 4e86e23..61334d0 100644
--- a/src/cowboy_decompress_h.erl
+++ b/src/cowboy_decompress_h.erl
@@ -66,9 +66,11 @@ data(StreamID, IsFin, Data, State=#state{next=Next0, enabled=false, read_body_bu
{Commands, Next} = cowboy_stream:data(StreamID, IsFin,
buffer_to_binary([Data|Buffer]), Next0),
fold(Commands, State#state{next=Next, read_body_is_fin=IsFin});
-data(StreamID, IsFin, Data, State0=#state{next=Next0, ratio_limit=RatioLimit,
+data(StreamID, IsFin, Data0, 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
+ Data = buffer_to_iovec([Data0|Buffer]),
+ Limit = iolist_size(Data) * RatioLimit,
+ case cow_deflate:inflate(Z, Data, Limit) of
{error, ErrorType} ->
zlib:close(Z),
Status = case ErrorType of
@@ -236,22 +238,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))}.