From 602a4c25b8067706f3bfd58582d05377c775c5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Thu, 12 Mar 2015 17:45:00 +0100 Subject: Simplify the SPDY code for merging duplicate headers --- src/cow_spdy.erl | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) (limited to 'src/cow_spdy.erl') diff --git a/src/cow_spdy.erl b/src/cow_spdy.erl index 39e68d7..789b602 100644 --- a/src/cow_spdy.erl +++ b/src/cow_spdy.erl @@ -284,35 +284,29 @@ goaway(LastGoodStreamID, Status) -> %% @todo window_update build_headers(Zdef, Headers) -> - DedupedHeaders = dedupe_headers(Headers, []), - NbHeaders = length(DedupedHeaders), + Headers1 = merge_headers(lists:sort(Headers), []), + NbHeaders = length(Headers1), Headers2 = [begin L1 = iolist_size(Key), L2 = iolist_size(Value), [<< L1:32 >>, Key, << L2:32 >>, Value] - end || {Key, Value} <- DedupedHeaders], + end || {Key, Value} <- Headers1], zlib:deflate(Zdef, [<< NbHeaders:32 >>, Headers2], full). -dedupe_headers([], Acc) -> +merge_headers([], Acc) -> lists:reverse(Acc); -dedupe_headers([{Key, Value}|Headers], Acc) -> - Acc2 = append_header_value(Key, Value, Acc, []), - dedupe_headers(Headers, Acc2). - -append_header_value(Key, Value, [], Acc) -> - [{Key, Value}|Acc]; -append_header_value(Key, Value, [{Key, PrevValue}|Rest], Acc) -> - [{Key, [PrevValue, 0, Value]}|Rest] ++ Acc; -append_header_value(Key, Value, [Header|Headers], Acc) -> - append_header_value(Key, Value, Headers, [Header|Acc]). +merge_headers([{Name, Value1}, {Name, Value2}|Tail], Acc) -> + merge_headers([{Name, [Value1, 0, Value2]}|Tail], Acc); +merge_headers([Head|Tail], Acc) -> + merge_headers(Tail, [Head|Acc]). -ifdef(TEST). -dedupe_headers_test_() -> +merge_headers_test_() -> Tests = [ {[{<<"set-cookie">>, <<"session=123">>}, {<<"set-cookie">>, <<"other=456">>}, {<<"content-type">>, <<"text/html">>}], [{<<"set-cookie">>, [<<"session=123">>, 0, <<"other=456">>]}, {<<"content-type">>, <<"text/html">>}]} ], - [fun() -> D = dedupe_headers(R, []) end || {R, D} <- Tests]. + [fun() -> D = merge_headers(R, []) end || {R, D} <- Tests]. -endif. to_flag(false) -> 0; -- cgit v1.2.3