aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-12-27 11:19:11 +0100
committerLoïc Hoguin <[email protected]>2019-12-27 11:19:11 +0100
commitbbc343c1399dd9d3e8468adc9a41b8529e748280 (patch)
treefb3319abe9ba2204cfba1f22bd7d2d040c74cc45
parentf14445f046f0d02284ade693e303114dc8214ff9 (diff)
downloadcowlib-bbc343c1399dd9d3e8468adc9a41b8529e748280.tar.gz
cowlib-bbc343c1399dd9d3e8468adc9a41b8529e748280.tar.bz2
cowlib-bbc343c1399dd9d3e8468adc9a41b8529e748280.zip
HPACK encoding now produces a more compact result
This in turn leads to a small performance improvement.
-rw-r--r--src/cow_hpack.erl18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/cow_hpack.erl b/src/cow_hpack.erl
index 669bea7..7db69b0 100644
--- a/src/cow_hpack.erl
+++ b/src/cow_hpack.erl
@@ -494,14 +494,14 @@ encode(Headers, State=#state{max_size=MaxSize, configured_max_size=MaxSize}) ->
encode(Headers, State, huffman, []);
encode(Headers, State0=#state{configured_max_size=MaxSize}) ->
{Data, State} = encode(Headers, State0#state{max_size=MaxSize}, huffman, []),
- {[enc_int5(MaxSize, 2#001), Data], State}.
+ {[enc_int5(MaxSize, 2#001)|Data], State}.
-spec encode(cow_http:headers(), State, opts()) -> {iodata(), State} when State::state().
encode(Headers, State=#state{max_size=MaxSize, configured_max_size=MaxSize}, Opts) ->
encode(Headers, State, huffman_opt(Opts), []);
encode(Headers, State0=#state{configured_max_size=MaxSize}, Opts) ->
{Data, State} = encode(Headers, State0#state{max_size=MaxSize}, huffman_opt(Opts), []),
- {[enc_int5(MaxSize, 2#001), Data], State}.
+ {[enc_int5(MaxSize, 2#001)|Data], State}.
huffman_opt(#{huffman := false}) -> no_huffman;
huffman_opt(_) -> huffman.
@@ -526,12 +526,12 @@ encode([{Name, Value0}|Tail], State, HuffmanOpt, Acc) ->
{name, Index} ->
State2 = table_insert(Header, State),
encode(Tail, State2, HuffmanOpt,
- [[enc_int6(Index, 2#01), enc_str(Value, HuffmanOpt)]|Acc]);
+ [[enc_int6(Index, 2#01)|enc_str(Value, HuffmanOpt)]|Acc]);
%% Literal header field representation: new name.
not_found ->
State2 = table_insert(Header, State),
encode(Tail, State2, HuffmanOpt,
- [[<< 0:1, 1:1, 0:6 >>, enc_str(Name, HuffmanOpt), enc_str(Value, HuffmanOpt)]|Acc])
+ [[<< 0:1, 1:1, 0:6 >>|[enc_str(Name, HuffmanOpt)|enc_str(Value, HuffmanOpt)]]|Acc])
end.
%% Encode an integer.
@@ -539,17 +539,17 @@ encode([{Name, Value0}|Tail], State, HuffmanOpt, Acc) ->
enc_int5(Int, Prefix) when Int < 31 ->
<< Prefix:3, Int:5 >>;
enc_int5(Int, Prefix) ->
- [<< Prefix:3, 2#11111:5 >>|enc_big_int(Int - 31, <<>>)].
+ enc_big_int(Int - 31, << Prefix:3, 2#11111:5 >>).
enc_int6(Int, Prefix) when Int < 63 ->
<< Prefix:2, Int:6 >>;
enc_int6(Int, Prefix) ->
- [<< Prefix:2, 2#111111:6 >>|enc_big_int(Int - 63, <<>>)].
+ enc_big_int(Int - 63, << Prefix:2, 2#111111:6 >>).
enc_int7(Int, Prefix) when Int < 127 ->
<< Prefix:1, Int:7 >>;
enc_int7(Int, Prefix) ->
- [<< Prefix:1, 2#1111111:7 >>|enc_big_int(Int - 127, <<>>)].
+ enc_big_int(Int - 127, << Prefix:1, 2#1111111:7 >>).
enc_big_int(Int, Acc) when Int < 128 ->
<<Acc/binary, Int:8>>;
@@ -560,9 +560,9 @@ enc_big_int(Int, Acc) ->
enc_str(Str, huffman) ->
Str2 = enc_huffman(Str, <<>>),
- [enc_int7(byte_size(Str2), 2#1), Str2];
+ [enc_int7(byte_size(Str2), 2#1)|Str2];
enc_str(Str, no_huffman) ->
- [enc_int7(byte_size(Str), 2#0), Str].
+ [enc_int7(byte_size(Str), 2#0)|Str].
enc_huffman(<<>>, Acc) ->
case bit_size(Acc) rem 8 of