diff options
author | Loïc Hoguin <[email protected]> | 2019-12-27 11:19:11 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2019-12-27 11:19:11 +0100 |
commit | bbc343c1399dd9d3e8468adc9a41b8529e748280 (patch) | |
tree | fb3319abe9ba2204cfba1f22bd7d2d040c74cc45 /src | |
parent | f14445f046f0d02284ade693e303114dc8214ff9 (diff) | |
download | cowlib-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/cow_hpack.erl | 18 |
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 |