From ca3b4d8d1b194d5dd4f2d452eb7bd88932e6617a Mon Sep 17 00:00:00 2001 From: Gustaf Sjoberg Date: Thu, 23 Feb 2017 11:35:32 +0100 Subject: Remove trailing whitespace from header values Edited to add a test and use byte_size instead of size. --- src/cow_http.erl | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cow_http.erl b/src/cow_http.erl index e79896b..f89e518 100644 --- a/src/cow_http.erl +++ b/src/cow_http.erl @@ -145,16 +145,32 @@ parse_hd_value(<< $\r, Rest/bits >>, Acc, Name, SoFar) -> << $\n, C, Rest2/bits >> when C =:= $\s; C =:= $\t -> parse_hd_value(Rest2, Acc, Name, << SoFar/binary, C >>); << $\n, Rest2/bits >> -> - parse_header(Rest2, [{Name, SoFar}|Acc]) + Value = clean_value_ws_end(SoFar, byte_size(SoFar) - 1), + parse_header(Rest2, [{Name, Value}|Acc]) end; parse_hd_value(<< C, Rest/bits >>, Acc, Name, SoFar) -> parse_hd_value(Rest, Acc, Name, << SoFar/binary, C >>). +%% This function has been copied from cowboy_http. +clean_value_ws_end(_, -1) -> + <<>>; +clean_value_ws_end(Value, N) -> + case binary:at(Value, N) of + $\s -> clean_value_ws_end(Value, N - 1); + $\t -> clean_value_ws_end(Value, N - 1); + _ -> + S = N + 1, + << Value2:S/binary, _/bits >> = Value, + Value2 + end. + -ifdef(TEST). parse_headers_test_() -> Tests = [ {<<"\r\nRest">>, {[], <<"Rest">>}}, + {<<"Server: Erlang/R17 \r\n\r\n">>, + {[{<<"server">>, <<"Erlang/R17">>}], <<>>}}, {<<"Server: Erlang/R17\r\n" "Date: Sun, 23 Feb 2014 09:30:39 GMT\r\n" "Multiline-Header: why hello!\r\n" -- cgit v1.2.3