Browse Source

Simplify the SPDY code for merging duplicate headers

Loïc Hoguin 10 years ago
parent
commit
602a4c25b8
1 changed files with 10 additions and 16 deletions
  1. 10 16
      src/cow_spdy.erl

+ 10 - 16
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;