Skip to content

Commit 5b51fb8

Browse files
tnt-devbenoitc
authored andcommitted
Handle empty or invalid ‘Content-Length’ (#450)
Ignore non-integer ‘Content-Length’ header.
1 parent d6eb869 commit 5b51fb8

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

src/hackney_http.erl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,10 @@ parse_header(Line, St) ->
293293
end,
294294
St1 = case hackney_bstr:to_lower(hackney_bstr:trim(Key)) of
295295
<<"content-length">> ->
296-
CLen = list_to_integer(binary_to_list(hackney_bstr:trim(Value))),
297-
St#hparser{clen=CLen};
296+
case catch list_to_integer(binary_to_list(Value)) of
297+
CLen when is_integer(CLen) -> St#hparser{clen=CLen};
298+
_ -> St
299+
end;
298300
<<"transfer-encoding">> ->
299301
TE = hackney_bstr:to_lower(hackney_bstr:trim(Value)),
300302
St#hparser{te=TE};
@@ -331,10 +333,12 @@ parse_body(St=#hparser{body_state=waiting, te=TE, clen=Length,
331333
{stream, fun te_chunked/2, {0, 0}, fun ce_identity/1}});
332334
_ when Length =:= 0 orelse Method =:= <<"HEAD">> ->
333335
{done, Buffer};
334-
_ ->
336+
_ when is_integer(Length) ->
335337
parse_body(St#hparser{body_state=
336338
{stream, fun te_identity/2, {0, Length},
337-
fun ce_identity/1}})
339+
fun ce_identity/1}});
340+
_ ->
341+
{done, Buffer}
338342
end;
339343
parse_body(#hparser{body_state=done, buffer=Buffer}) ->
340344
{done, Buffer};

src/hackney_response.erl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,11 @@ wait_headers({headers_complete, Parser}, Client, Status, Headers) ->
114114
TE = hackney_headers_new:get_value(<<"transfer-encoding">>, Headers, nil),
115115
CLen = case hackney_headers_new:lookup("content-length", Headers) of
116116
[] -> nil;
117-
[{_, Len} |_] -> list_to_integer(binary_to_list(Len))
117+
[{_, Len} |_] ->
118+
case catch list_to_integer(binary_to_list(Len)) of
119+
V when is_integer(V) -> V;
120+
_ -> nil
121+
end
118122
end,
119123
Client2 = Client#client{parser=Parser,
120124
headers=Headers,
@@ -128,8 +132,9 @@ stream_body(Client=#client{method= <<"HEAD">>, parser=Parser}) ->
128132
Buffer = hackney_http:get(Parser, buffer),
129133
Client2 = end_stream_body(Buffer, Client),
130134
{done, Client2};
131-
stream_body(Client=#client{parser=Parser, clen=0, te=TE})
132-
when TE /= <<"chunked">> ->
135+
stream_body(Client=#client{parser=Parser, clen=CLen, te=TE})
136+
when (CLen =:= 0 orelse not is_integer(CLen)) andalso
137+
TE /= <<"chunked">> ->
133138
Buffer = hackney_http:get(Parser, buffer),
134139
Client2 = end_stream_body(Buffer, Client),
135140
{done, Client2};

src/hackney_stream.erl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,10 @@ process({header, {Key, Value}=KV, NParser},
339339
%% store useful headers
340340
Client1 = case hackney_bstr:to_lower(Key) of
341341
<<"content-length">> ->
342-
CLen = list_to_integer(binary_to_list(Value)),
343-
Client#client{clen=CLen};
342+
case catch list_to_integer(binary_to_list(Value)) of
343+
CLen when is_integer(CLen) -> Client#client{clen=CLen};
344+
_ -> Client
345+
end;
344346
<<"transfer-encoding">> ->
345347
Client#client{te=hackney_bstr:to_lower(Value)};
346348
<<"connection">> ->

0 commit comments

Comments
 (0)